diff --git a/60 ScansProcessing/corrections.json b/60 ScansProcessing/corrections.json index 66a5a13..2b2db19 100644 --- a/60 ScansProcessing/corrections.json +++ b/60 ScansProcessing/corrections.json @@ -518,5 +518,21 @@ { "original": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [13–21APR2026 impl. TEP coxae l.dx., koxartróza l.dx. KL IV.].pdf", "corrected": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [13–21APR2026 impl. TEP coxae l.dx., koxartróza l.dx., indikace KLL VII_10].pdf" + }, + { + "original": "480416072 2026-03-09 Štrup, Petr [žádanka OZP] [žádanka o vyšetření zdravotního stavu pro průkaz OZP, komplexní vyšetření 958 Kč].pdf", + "corrected": "480416072 2026-03-09 Štrup, Petr [žádanka IPZS] [žádanka o vyšetření zdravotního stavu pro průkaz OZP, komplexní vyšetření 958 Kč].pdf" + }, + { + "original": "9301280417 2026-03-25 Vaňous, Jakub [žádost o předání zdravotních informací] [registrace u MUDr. Panáčkové, žádost o zaslání dokumentace].pdf", + "corrected": "9301280417 2026-03-25 Vaňous, Jakub [žádost o předání zdravotních informací] [ResTrial s.r.o.].pdf" + }, + { + "original": "Binder1.pdf", + "corrected": "8056010149 2026-04-28 [výbìr nekompletních zpráv] [od pacientky].pdf" + }, + { + "original": "6709150613 2026-04-28 Rutrle, Petr [LZ ORL] [PVS - v.s m. Menier, t.č hypaksuis perc. apicochlearis].pdf", + "corrected": "6709150613 2026-04-28 Rutrle, Petr [LZ ORL] [PVS - v.s m. Menier, t.č hypakusis perc. apicochlearis, doporučena hyperbarická komora].pdf" } ] \ No newline at end of file diff --git a/60 ScansProcessing/extract_patient_info_novy.py b/60 ScansProcessing/extract_patient_info_novy.py index 7a22dbf..70bda53 100644 --- a/60 ScansProcessing/extract_patient_info_novy.py +++ b/60 ScansProcessing/extract_patient_info_novy.py @@ -260,28 +260,32 @@ def extract_info(pdf_path: Path) -> dict: ) print(" Volám Claude Vision API...") - client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) - response = client.messages.create( - model="claude-sonnet-4-6", - max_tokens=400, - messages=[{"role": "user", "content": [ - {"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": image_b64}}, - {"type": "text", "text": prompt}, - ]}], - ) - usage = response.usage - print(f" Tokeny: {usage.input_tokens} in + {usage.output_tokens} out = ${usage.input_tokens*3/1e6 + usage.output_tokens*15/1e6:.4f}") - - raw = response.content[0].text.strip() - if raw.startswith("```"): - raw = raw.split("```")[1] - if raw.startswith("json"): - raw = raw[4:] try: - return json.loads(raw.strip()) - except json.JSONDecodeError: - print(f" VAROVÁNÍ: nelze parsovat JSON: {raw!r}") - return {"nazev_souboru": None, "raw": raw} + client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) + response = client.messages.create( + model="claude-sonnet-4-6", + max_tokens=400, + messages=[{"role": "user", "content": [ + {"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": image_b64}}, + {"type": "text", "text": prompt}, + ]}], + ) + usage = response.usage + print(f" Tokeny: {usage.input_tokens} in + {usage.output_tokens} out = ${usage.input_tokens*3/1e6 + usage.output_tokens*15/1e6:.4f}") + + raw = response.content[0].text.strip() + if raw.startswith("```"): + raw = raw.split("```")[1] + if raw.startswith("json"): + raw = raw[4:] + try: + return json.loads(raw.strip()) + except json.JSONDecodeError: + print(f" VAROVÁNÍ: nelze parsovat JSON: {raw!r}") + return {"nazev_souboru": None, "raw": raw} + except Exception as e: + print(f" VAROVÁNÍ: Claude API selhalo ({e}) — otevírám dialog pro ruční vyplnění.") + return {"nazev_souboru": None} # ─── Subprocess helpers ─────────────────────────────────────────────────────── @@ -311,7 +315,8 @@ def run_rename_dialog(nazev: str, info_lines: list, below_y: int = None) -> str args = [sys.executable, str(RENAME_DIALOG), str(tmp)] if below_y is not None: args.append(f"--below-y={below_y}") - proc = subprocess.run(args, capture_output=True, text=True, encoding="utf-8") + env = {**os.environ, "PYTHONIOENCODING": "utf-8", "PYTHONUTF8": "1"} + proc = subprocess.run(args, capture_output=True, text=True, encoding="utf-8", env=env) tmp.unlink(missing_ok=True) out = proc.stdout.strip() return json.loads(out).get("value") if out else None diff --git a/60 ScansProcessing/rename_dialog.py b/60 ScansProcessing/rename_dialog.py index 4e89e33..6b3c4e0 100644 --- a/60 ScansProcessing/rename_dialog.py +++ b/60 ScansProcessing/rename_dialog.py @@ -6,10 +6,21 @@ JSON vstup: { "nazev": "...", "info_lines": [...] } JSON výstup: { "value": "..." } nebo { "value": null } """ import json +import os import sys from pathlib import Path import tkinter as tk +if sys.platform == "win32": + try: + from ctypes import windll + windll.shcore.SetProcessDpiAwareness(1) + except Exception: + pass + import io + sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace") + def main(): if len(sys.argv) < 2: @@ -27,6 +38,7 @@ def main(): root.resizable(True, False) root.attributes("-topmost", True) root.tk.call("encoding", "system", "utf-8") + os.environ.setdefault("TCL_ENCODING", "utf-8") pad = {"padx": 12, "pady": 6}