This commit is contained in:
2026-04-28 16:01:53 +02:00
parent f31b271e93
commit 2b0d249eae
3 changed files with 55 additions and 22 deletions
+16
View File
@@ -518,5 +518,21 @@
{ {
"original": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [1321APR2026 impl. TEP coxae l.dx., koxartróza l.dx. KL IV.].pdf", "original": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [1321APR2026 impl. TEP coxae l.dx., koxartróza l.dx. KL IV.].pdf",
"corrected": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [1321APR2026 impl. TEP coxae l.dx., koxartróza l.dx., indikace KLL VII_10].pdf" "corrected": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [1321APR2026 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"
} }
] ]
+27 -22
View File
@@ -260,28 +260,32 @@ def extract_info(pdf_path: Path) -> dict:
) )
print(" Volám Claude Vision API...") 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: try:
return json.loads(raw.strip()) client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
except json.JSONDecodeError: response = client.messages.create(
print(f" VAROVÁNÍ: nelze parsovat JSON: {raw!r}") model="claude-sonnet-4-6",
return {"nazev_souboru": None, "raw": raw} 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 ─────────────────────────────────────────────────────── # ─── 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)] args = [sys.executable, str(RENAME_DIALOG), str(tmp)]
if below_y is not None: if below_y is not None:
args.append(f"--below-y={below_y}") 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) tmp.unlink(missing_ok=True)
out = proc.stdout.strip() out = proc.stdout.strip()
return json.loads(out).get("value") if out else None return json.loads(out).get("value") if out else None
+12
View File
@@ -6,10 +6,21 @@ JSON vstup: { "nazev": "...", "info_lines": [...] }
JSON výstup: { "value": "..." } nebo { "value": null } JSON výstup: { "value": "..." } nebo { "value": null }
""" """
import json import json
import os
import sys import sys
from pathlib import Path from pathlib import Path
import tkinter as tk 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(): def main():
if len(sys.argv) < 2: if len(sys.argv) < 2:
@@ -27,6 +38,7 @@ def main():
root.resizable(True, False) root.resizable(True, False)
root.attributes("-topmost", True) root.attributes("-topmost", True)
root.tk.call("encoding", "system", "utf-8") root.tk.call("encoding", "system", "utf-8")
os.environ.setdefault("TCL_ENCODING", "utf-8")
pad = {"padx": 12, "pady": 6} pad = {"padx": 12, "pady": 6}