
    Cj                         d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	Z	d dl
Zd dlmZ 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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
gZd+Zd,Z ej        g d-          Z ej        g d.          Z ej        g d/          Z ej        d0  ed1          D                       Ze G d2 d3                      Ze G d4 d5                      ZdNd;ZdOdBZdPdGZdQdRdMZdS )S    )annotations)	dataclassasdict)Path)AnyN)Imagei01u   Anmeldebüro & KursverlaufuD   Der Prozess von der Ankündigung bis zur Teilnahme war unkompliziert)idcategorytexti02u^   Die Organisation des Kurses (z. B. Zeitplan, Struktur) ist für mich klar und nachvollziehbar.i03u>   Ich fühle mich über die Abläufe und Termine gut informiert.i04GruppenseminareuN   Die Inhalte der Gruppenseminare sind für meine berufliche Situation relevant.i05z*Es wurden die erwarteten Themen behandelt.i06EinzelcoachinguR   Die Einzelcoachings helfen mir, meine beruflichen Ziele zu klären und umzusetzen.i07u\   Ich erhalte Unterstützung bei der Stellensuche und der Erstellung der Bewerbungsunterlagen.i08u@   Mein Coach geht auf meine persönliche Situation und Fragen ein.i09uH   Ich erhalte konkrete und umsetzbare Tipps für meinen Bewerbungsprozess.i10Eigenarbeitu`   Die technische Ausstattung (Laptop, Internet) ist ausreichend für meine Bewerbungsaktivitäten.i11uK   Bei Fragen während der Eigenarbeit erhalte ich ausreichend Unterstützung.i12uH   Ich fühle mich sicherer im Umgang mit digitalen Tools für Bewerbungen.i13Gesamtbewertungua   Der Kurs hat mir geholfen, ein besseres Verständnis für den aktuellen Arbeitsmarkt zu erhalten.i14u>   Ich habe praktische Tipps für den Bewerbungsprozess erhalten.i15u@   Ich würde den Kurs anderen in meiner Situation weiterempfehlen.g     @g     H@)g     @g     @g     @g     @g     @)g     x@g     @g     @g     X@g     @g     P@g     @g     @g     @g     @g     @g     X@)g     q@g     t@g      x@c                P    g | ]#}t           |         t           |d z            z   dz  $S )      )	X_CENTERS).0is     ;/home/gmu/.Hermes/workspace/smileys_webapp/app/extractor.py
<listcomp>r&   %   s/    MMMqilYq1u%55:MMM       c                  <    e Zd ZU ded<   ded<   ded<   dZded<   dS )	
CellResultz
int | Nonevaluestr
confidencemethod detailsN)__name__
__module____qualname____annotations__r0    r'   r%   r*   r*   (   sA         OOOKKKGr'   r*   c                  8    e Zd ZU ded<   ded<   ded<   ded<   d	S )
QuestionnaireResultintquestionnaire_idr,   	pdf_pageszlist[int | None]valueslist[CellResult]cellsN)r1   r2   r3   r4   r5   r'   r%   r7   r7   0   s?         NNNr'   r7   xfloatsxreturnr8   c                f    t           |z  }t          dt          j        | |k              z             S )Nr    )X_BOUNDSr8   npsum)r>   r@   boundss      r%   	_assign_xrG   8   s,    ]Fq26!f*%%%&&&r'   arr
np.ndarrayy0y1x0x1c                    | j         d d         \  }}| t          d|          t          ||          t          d|          t          ||          f         S )Nr!   r   )shapemaxmin)rH   rJ   rK   rL   rM   hws          r%   _cliprT   =   sO    9RaR=DAqs1bzz#a**$c!RjjQ&;;<<r'   imgImage.Imagerowsr<   c                4   t          j        |                     d                    }|j        d d         \  }}|t          z  }|t
          z  }t          |z                      t                    }||z                      t                    }t          d|z            }	t          d|z            }
|d d d d df         |d d d d df         |d d d d df         }}}|dk    ||dz   k    z  ||d	z   k    z  |d
k     z  |d
k     z  }|dk     |dk     z  |dk     z  }g }t          |          D ]\  }}t          |t          |d|z  z
            t          |d|z  z             |	|
          }t          j        |          }t          |          t          dt          d|z  |z                      k    r|d d df         |	z   }t          t          j        |d                    }t!          ||          }t          |          dk    rdnd}dt          |           d|d}t          |          dk     r|dz  }|                    t%          ||d|                     4g }|D ]}t          |t          |d|z  z
            t          |d|z  z             t          |d|z  z
            t          |d|z  z                       }|                    t          |                                                     t)          |          }t          |          dk    r|d         |d         z
  nd}|rt          |          nd}|t          dt          d|z  |z                      k    s'|t          dt          d|z  |z                      k    r\t          t          j        |          dz             }|dk    rd nd}|                    t%          ||d!d"| d#| d$                     |                    t%          d d%d&d"| d#|                      |S )'NRGBr!   i  i[  r   r    P      
         (         g333333?<   highlowzblue_pixels=z, x15=z.1f2   u/   ; bitte prüfen: wenige Pixel / evtl. Randnotizblue      -   ih  F   mediumdarkzscores=z	, excess=z; schwarze Markierung/Fallbackblanknone)rD   asarrayconvertrO   BASE_WBASE_Hr"   astyper8   	enumeraterT   argwherelenrP   r?   quantilerG   appendr*   rE   sortedargmax) rU   rW   rH   rR   rS   r@   syxsys	search_x0	search_x1rgbrf   rn   resultsrow_idxybandptsx_positionsxqr+   r-   r0   scoresr>   croporderedexcess	max_scores                                    r%   _detect_page_valuesr   B   sO   
*S[[''
(
(C9RaR=DAq	
VB	
VB
b.	 	 	%	%B
)		C	 	 BC"HID2II!!!QQQ'lC111aL#aaaAg,!qAFq1r6z"a!b&j1QW=SIDGC AG,D "Gmm c c
T3q27{++SR"W-=-=y)TTk$s88s1c!b&2+..////aaad)i/Kr{;5566Bb"%%E#&s88r>>uJ=SXX==R===G3xx"}}LLNN:eZIIJJJ  	+ 	+As1rBw;//Qb[1A1A3q2PR7{CSCSUXYZ]_bd]dYdUeUeffDMM#dhhjj//****...1'lla.?.?wr{**Q#)0CKKKq	SSb2..////9CSSUXXZ]I[I[@\@\3\3\	&))A-..E%+r\\uJNN:eZ  BC6  BC  BC\b  BC  BC  BC  D  D  E  E  E  ENN:dGV=`v=`=`X^=`=`aabbbbNr'   pdf_path
str | Path
render_dirstr | Path | Nonedict[str, Any]c           
        t          |           } t          j        |           }|j        }|dk     rt	          d          |rt          |          nd}|r|                    dd           g }t          |          D ]\  }}|                    t          j        dd          d          }t          j
        d|j        |j        g|j                  }	|                    |	           |r |	                    |d	|d
z   ddz             g }
|dz  }t!          |          D ]}|dz  }|dz  d
z   }g }|                    t%          ||         t&                               ||k     r/|                    t%          ||         t(                               n,|                    d t!          d          D                        |
                    t+          |d
z   |d
z    d||k     r|d
z   nd d |D             |                     g }|dz  r|                    d           t-          d |
D                       }|r|                    | d           |t/          |
          t0          d |
D             |dS )zExtract 1-5 smiley values from a scanned bfz evaluation PDF.

    Assumes questionnaire pages come in pairs: first page with 12 scaled items,
    second page with 3 Gesamtbewertung items.
    r!   uJ   PDF enthält weniger als 2 Seiten; erwartet werden Fragebogen-Seitenpaare.NT)parentsexist_okF)matrixalpharY   page_r    02dz.pngc                2    g | ]}t          d ddd          S )Nro   missing_pagezzweite Seite fehlt)r*   )r#   _s     r%   r&   zextract_pdf.<locals>.<listcomp>   s(    lll^_*T7NDXYYlllr'      -?c                    g | ]	}|j         
S r5   )r+   r#   cs     r%   r&   zextract_pdf.<locals>.<listcomp>   s    ///A///r'   )r9   r:   r;   r=   uU   Ungerade Seitenzahl: letzte Seite wurde nicht als vollständiger Fragebogen gewertet.c              3  @   K   | ]}|j         D ]}|j        d v dV  dS )>   rd   ro   r    N)r=   r-   )r#   qr   s      r%   	<genexpr>zextract_pdf.<locals>.<genexpr>   s>      ]]A]]AALL\<\<\a<\<\<\<\<\]]r'   up    Felder sind leer oder niedrig sicher erkannt – in der Tabelle prüfen. Ja, leider genau der langweilige Teil.c                V    g | ]&}i t          |          d d |j        D             i'S )r=   c                ,    g | ]}t          |          S r5   )r   r   s     r%   r&   z*extract_pdf.<locals>.<listcomp>.<listcomp>   s    #?#?#?!F1II#?#?#?r'   )r   r=   )r#   r   s     r%   r&   zextract_pdf.<locals>.<listcomp>   sL     
 
 
EF@vayy@'#?#?qw#?#?#?@@
 
 
r'   )
page_countquestionnaire_countitemsquestionnaireswarnings)r   fitzopenr   
ValueErrormkdirrv   
get_pixmapMatrixr   	frombyteswidthheightsamplesrz   saverangeextendr   Y_ODDY_EVENr7   rE   rx   ITEMS)r   r   docr   render_pathrenderedr$   pagepixrU   r   
pair_countqidx
page_a_idx
page_b_idxr=   r   rd   s                     r%   extract_pdfr   v   s    H~~H
)H

CJA~~efff&0:$z"""dK 7$666"$HS>> < <4ooT[A%6%6eoDDoeci%<ckJJ 	<HH[#:1q5#:#:#:#::;;;02NqJj!! 
 
AX
AX\
(*)=uEEFFF
""LL,Xj-A6JJKKKKLLllchijckcklllmmm!%'!^bb
Z@W@Wj1nn]`bb/////	  	
 	
 	
 	
 HA~ qoppp
]]]]]
]
]C
 R3  Q  Q  Q  	R  	R  	R !">22
 
JX
 
 
   r'   )r>   r?   r@   r?   rA   r8   )rH   rI   rJ   r8   rK   r8   rL   r8   rM   r8   rA   rI   )rU   rV   rW   rI   rA   r<   )N)r   r   r   r   rA   r   )
__future__r   dataclassesr   r   pathlibr   typingr   r   numpyrD   PILr   r   rs   rt   arrayr"   r   r   r   rC   r*   r7   rG   rT   r   r   r5   r'   r%   <module>r      s   " " " " " " ) ) ) ) ) ) ) )                        :  EK  L  L:  Ee  f  f:  EE  F  F/  :J  K  K/9eff.  9M  N  N.  9W  X  X.8z{{.  9C  D  Dm  6X  Y  Ym  6C  D  Dm5  A  A/  :]  ^  ^/9yzz/9{||	( 
	BH:::;;	lllmm	'''	(	(28MMEE!HHMMMNN                ' ' ' '
= = = =
1 1 1 1h; ; ; ; ; ; ;r'   