Z230
This commit is contained in:
@@ -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",
|
"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"
|
"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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user