
    6ji+              	          d Z ddlZddlZddlZddlZ ej
                  d      Zdededee   defdZ	dede
fd	Zdedee   fd
Zddee   dedeee      fdZdee   fdZdedee   dee   fdZdedee   dee   fdZdedee   fdZdedefdZedk(  r^ eej.                        dk7  r ed        ej2                  d        e ej4                   eej.                  d         dd             yy)u2  
Script 2 (analyze) – parser jednoho PDF denního záznamu do strukturovaných dat.

Zatím jen parsování + výpis JSON pro ověření na reálných PDF, bez zápisu
do DB (to přidáme, až bude parser ověřený na víc dnech).

Použití:
    venv/bin/python parse_pdf.py PDF/kongres_2026-08-11.pdf
    NuY   (\d{2}:\d{2})\s+(\S+)\s+([\d,]+)°C\s+([\d,]+)\s*mm/h\s+([\d,]+)\s*m/s\s+(\d+)°\s+(\d+)%textstart_markerend_markersreturnc                     | j                  |      }|dk(  ry|t        |      z  }t        |       }|D ]&  }| j                  ||      }|dk7  st        ||      }( | || S )N )findlenmin)r   r   r   startendmarkeridxs          @/var/www/html/adenira/solution/Kongress_pdf_imports/parse_pdf.py_extract_sectionr      sq    IIl#E{	SE
d)C  ii&"9c3-C  c?    c                 @    t        t        j                  d|             S )uE   Uzavřený den má na konci sekci 'Podpisy:' se skutečným podpisem.z\bPodpisy\s*:)boolresearch)r   s    r   	is_closedr   #   s    		*D122r   c                 Z   g }t         j                  |       D ]  }|j                         \  }}}}}}}	|j                  ||t	        |j                  dd            t	        |j                  dd            t	        |j                  dd            t        |      t        |	      d        |S )N,.)casstav	teplota_c	srazky_mmvitr_mssmer_vetru_degvlhkost_pct)WEATHER_ROW_REfinditergroupsappendfloatreplaceint)
r   rowsmtime_s	conditiontempprecip
wind_speedwind_dirhumiditys
             r   parse_weatherr3   (   s    D$$T* 
JK((*G	4Xxt||C56v~~c378Z//S9:!(mx=
 	
 Kr   wordsy_tolc                     g }t        | d       D ]H  }|r2t        |d   |d   d   d   z
        |k  r|d   j                  |       7|j                  |g       J |D ]  }|j                  d         |S )uH   Seskupí slova do řádků podle Y pozice (top), seřazené shora dolů.c                     | d   S )Ntop ws    r   <lambda>z_group_by_row.<locals>.<lambda>;   s
    5 r   )keyr8   r   r   c                     | d   S )Nx0r9   r:   s    r   r<   z_group_by_row.<locals>.<lambda>A   s
    qw r   )sortedabsr&   sort)r4   r5   r*   r;   rows        r   _group_by_rowrD   8   s    DE12 C%48A;u#556%?HOOAKK	
  (&'(Kr   c           	      J   | j                  d      }t        d |D        d      g S t        fd|D        d      }|t        d |D              dz   }|D cg c]  }|d   cxk  r|k  sn n| }}t        |      D cg c]  }t	        d |D              s| }}|sg S |d	   }|d	   d   }t        d
 |D              }	t        t        |	|	dd dgz               dt        dt        dz  ffd}
|D cg c]  }|d   |dz   kD  s| }}t        t                    D ci c]  }|g  }}t        |      D ]x  }i }|D ]4  } |
|d         }||j                  |g       j                  |d          6 |j                         D ](  \  }}||   j                  dj                  |             * z g }|j!                         D ]  }d}|D ]  }t#        j$                  d|      }|s1|.|j'                         r|dxx   d|j'                         z   z  cc<   L|d|j)                          j'                         }|sp|t        |j+                  d            t        |j+                  d            d}|j                  |         |S c c}w c c}w c c}w c c}w )u  Tabulka 'Osoby na staveništi' má 3 sloupcové skupiny vedle sebe a
    dlouhé názvy dodavatelů se lámou na druhý řádek – při čtení jako
    lineární text se pak zalomený zbytek spojí s nesouvisejícím sloupcem
    na stejném fyzickém řádku (viz komentáře v historii souboru/gitu).
    Řešíme proto podle skutečných X/Y souřadnic slov na stránce, ne textem.
       x_tolerancec              3   l   K   | ],  }|d    j                         j                  d      s&|d    . yw)r   OSOBYr8   Nupper
startswith.0r;   s     r   	<genexpr>zparse_osoby.<locals>.<genexpr>O   s,     JaAfIOO$5$@$@$I5Js   '4
4Nc              3      K   | ]5  }|d    kD  s|d   j                         j                  d      s/|d     7 yw)r8   r   
MECHANIZMYNrK   )rO   r;   section_tops     r   rP   zparse_osoby.<locals>.<genexpr>T   s9     jaAeH{$:qy?P?[?[\h?i5js   >">
>c              3   &   K   | ]	  }|d      yw)bottomNr9   rN   s     r   rP   zparse_osoby.<locals>.<genexpr>X   s     8QQx[8s   r8   c              3   ,   K   | ]  }|d    dk(    yw)r      NÁZEVNr9   rN   s     r   rP   zparse_osoby.<locals>.<genexpr>[   s     Ac\]!F)xBWAcs   r   c              3   8   K   | ]  }|d    dk(  s|d     yw)r   rW   r?   Nr9   rN   s     r   rP   zparse_osoby.<locals>.<genexpr>a   s     MAqyH7L$Ms   
g    .Ar?   r   c                 Z    t              D ]  \  }\  }}|dz
  | cxk  r	|k  s|c S   y )N   )	enumerate)r?   ilohi
col_boundss       r   	col_indexzparse_osoby.<locals>.col_indexd   s?    $Z0 	KAxBAv b  !	 r   rZ   r    z(\d+)\s+(\d+)\s*$	dodavatel)rb   pocethodin)extract_wordsnextmaxrD   anyr@   listzipr'   r)   ranger   
setdefaultr&   itemsjoinvaluesr   r   stripr   group)pager4   section_bottomr;   section_wordsrheader_rows
header_row
header_top
col_startsr`   
data_wordsr\   
per_columnrC   by_colcitextsr*   lineslast_rowliner+   namer_   rS   s                           @@r   parse_osobyr   E   s    1-EJ5JDK 	j5jN 8%881< %Q1qx)P.)PQQMQ+M:dcAcabAc>c1dKd	QJAu%JMMMJc*jn}&DEFJe d
  +Haha.G!HJH7<S_7M'N!2'NJ'NZ( 3') 	<A1T7#B~!!"b)006;	<   	3IBrN!!#((5/2	33 D""$ " 	"D		.5A 'DJJL[)S4::<-??)!'')$**,D%)C
OcRSRYRYZ[R\o^HKK!	""  K[ Rd I'Ns*   J0JJJ<JJ)
J known_suppliersc           	      z   t        | dddg      }t        j                  dd|      }g }d}t        j                  d|      D ]  }dj	                  |||j                          j                               }|j                         }|sFt        |j                  d            t        |j                  d	            t        |j                  d
            }	}}|d }}
t        |t        d      D ]4  }|j                  |      s|d t        |        j                         }
|} n |j                  |
||||	d        |S )NzMECHANIZMY:   PROVEDENÉ PRÁCE:   DALŠÍ ZÁZNAMY:uB   NÁZEV PROSTŘEDKU\s+NÁZEV DODAVATELE\s+POSÁDKA\s+POČ\.\s+HOD\.ra   r   z(\d+)\s+(\d+)\s+(\d+)(?=\s|$)rF   rZ      Tr=   reverse)nazevrb   posadkarc   rd   )r   r   subr$   rn   r   splitr   r)   rq   r@   r   endswithrp   r&   )r   r   blockr*   prev_endr+   	text_partr   rc   rd   resourcesuppliersups                r   parse_mechanizmyr      s/   T=3GI\2]^EFFXZ]_deEDH[[95A HHU8AGGI6<<>?	557 #AGGAJQWWQZ#aggaj/&(/sDA 	C!!#&$[Cy1779		 	H
 	$ Kr   c                 @   t        | ddg      }t        j                  dd|      }t        |t        d      }g }d }|j                         D ]  }|j                         }|j                  d      s%|j                  d      j                         }d }|D ]4  }|j                  |      s|d t	        |        j                         }|} n |||j                  |       |r|gng |d	}|g d d	}|s|d
   j                  |        ||j                  |       |S )Nr   r   u#   POPIS\s+NÁZEV DODAVATELE\s+MN\s+MJra   Tr   -z- )popisrb   r   )r   r   r   r@   r   
splitlinesrp   rM   lstripr   r&   )	r   r   r   suppliers_sortedr%   currentr   rb   r   s	            r   parse_pracer      s9   T#7:M9NOEFF93FE o3E
 FG  " .zz|s#{{4 &&(	# 	C}}S!Ks3xi(..0			  "g&*.BYOG$&T: ''-+.. gMr   c                    t        | ddg      }t        j                  d|j                               }g }|D ]J  }|j                         }|j	                  d      s&|j                         }|d   }d|v r|j                  dd      \  }}n|d}}|j                  ddd      j                         }t        j                  d	|      }	|	r|	j                  d      nd }
|	r!|d |	j                          j                         n|}|dd  }d
|v r|j                  d
      }|d | ||dz   d  }}n|g }}|j                  ||
|j                         dj                  d |D              dj                  d |D              xs d d       M |S )Nr   zPodpisy:z\n(?=AUTOR\s)AUTORr   u   NÁZEV DODAVATELErF   r	   z\((.+?)\)\s*$u	   PŘÍLOHYra   c              3   ^   K   | ]%  }|j                         s|j                          ' y wNrp   rO   ls     r   rP   z&parse_dalsi_zaznamy.<locals>.<genexpr>   s     H1aggiQWWYH   --c              3   ^   K   | ]%  }|j                         s|j                          ' y wr   r   r   s     r   rP   z&parse_dalsi_zaznamy.<locals>.<genexpr>   s     #Q!qwwyAGGI#Qr   )autorrolerb   r   prilohy_raw)r   r   r   rp   rM   r   r(   r   rq   r   indexr&   rn   )r   r   chunksentrieschunkr   headerauthor_partrb   
role_matchr   authorrestr   
body_linesattach_liness                   r   parse_dalsi_zaznamyr      s    T#6EEXX&6FG  (  "q&(%+\\2Eq%I"K%+RK!))'2q9??AYY/=
&0z"d>H1z//1288:kQRy$**[)C'+DSz4a>J'+RJ"*HHH
HH 88#Q|#QQYUY
 	1 B Nr   pdf_pathc                    t        j                  |       5 }dj                  d |j                  D              }t	        j
                  dd|      }t        |      }|t        |      d}|r[t        |j                  d         }|D cg c]  }|d   	 }}t        |      |d<   ||d<   t        ||      |d	<   t        ||      |d
<   d d d        |S c c}w # 1 sw Y   S xY w)N
c              3   H   K   | ]  }|j                  d       xs d  yw)rF   rG   r	   N)extract_text)rO   rr   s     r   rP   zparse_pdf.<locals>.<genexpr>  s&     VD**q*9?R?Vs    "u\   ČÁST B - DENNÍ ZÁZNAMY STRANA\s*\d*\s*KCP - STAVEBNÍ DENÍK - \d{4}-\d{2}-\d{2}\.PDF\s*)closeddalsi_zaznamyr   rb   pocasiosoby
mechanizmyprace)
pdfplumberopenrn   pagesr   r   r   r   r   r3   r   r   )r   pdfr   r   resultr   o	supplierss           r   	parse_pdfr      s    		" ;c yyVCIIVV
 vvk$

 406
   		!-E167A;7I7,T2F8#F7O#3D)#DF< )$	:F7O7;8 M 8/;8 Ms   A1CC3CCC__main__rZ   u,   Použití: python parse_pdf.py <cesta_k_pdf>rF   F)ensure_asciiindent)g       @)__doc__jsonr   sysr   compiler#   strri   r   r   r   dictr3   r'   rD   r   r   r   r   r   __name__r   argvprintexitdumpsr9   r   r   <module>r      s~    	 
 `

3 
c 
S	 
c 
3C 3D 3
 T
  
d 
E 
Dd<L 
Bd BJ3 c tDz 6)c )DI )$t* )X)c )d4j )X  @ z
388}<=	*$**Ysxx{+%
JK	 r   