This commit is contained in:
2026-05-18 11:21:13 +02:00
parent 6498c4e444
commit d5b630a793
5 changed files with 125 additions and 12 deletions
+18
View File
@@ -11,6 +11,24 @@ Worktree (`.claude/worktrees/*`) slouží jen pro interní práci Claude, ne jak
Každý adresář se skriptem má vlastní `NOTES.md` s technickými detaily. Přečti relevantní NOTES.md podle toho, čeho se konverzace týká. Každý adresář se skriptem má vlastní `NOTES.md` s technickými detaily. Přečti relevantní NOTES.md podle toho, čeho se konverzace týká.
## Anthropic API klíč
Uložen v `Medevio/.env` jako `ANTHROPIC_API_KEY=sk-ant-...`.
Skripty, které volají Claude API, si ho načítají samy — vzor:
```python
def _load_env():
env_path = Path(__file__).resolve().parent.parent / "Medevio" / ".env"
if env_path.exists():
for line in env_path.read_text(encoding="utf-8").splitlines():
line = line.strip()
if "=" in line and not line.startswith("#"):
k, v = line.split("=", 1)
os.environ[k.strip()] = v.strip()
_load_env()
```
## Sdílené knihovny (`Knihovny/`) ## Sdílené knihovny (`Knihovny/`)
Před psaním nového kódu vždy zkontroluj, zda existuje vhodná sdílená funkce. Před psaním nového kódu vždy zkontroluj, zda existuje vhodná sdílená funkce.
+22 -1
View File
@@ -4,11 +4,32 @@
Univerzální skript pro oba druhy skenování níže. Vše se odvodí automaticky z PDF. Univerzální skript pro oba druhy skenování níže. Vše se odvodí automaticky z PDF.
**Dávkový režim (bez argumentů)** — zpracuje všechna PDF ve `vstup/`:
```
python rozloz_brozuru.py
```
- Výstup jde do `vystup/<nazev>_serazena.pdf`
- Po úspěchu se vstupní soubor přejmenuje: `<nazev> [ZPRACOVANO].pdf`
- Soubory s `[ZPRACOVANO]` v názvu jsou přeskočeny
- Chyba u jednoho souboru nezastaví zpracování ostatních
**Explicitní argumenty** (zachována zpětná kompatibilita):
``` ```
python rozloz_brozuru.py vstup/<soubor.pdf> vystup/<soubor_serazena.pdf> python rozloz_brozuru.py vstup/<soubor.pdf> vystup/<soubor_serazena.pdf>
``` ```
Pokud není zadán výstup, pojmenuje se `<vstup>_serazena.pdf` ve stejném adresáři jako vstup. ## Skript: `navrh_pojmenovani.py`
Vezme prvních 5 stránek PDF, pošle je Claude API jako obrázky, navrhne název souboru.
```
python navrh_pojmenovani.py
```
- Bez argumentu otevře dialog pro výběr souboru (výchozí adresář: `vystup/`)
- Název vždy začíná `YYYY-MM-DD_`
- Dialog umožní opravit návrh; historie se ukládá do `pojmenovani_historie.json`
- Pokud Claude navrhne stejné jméno jako posledně, dialog se předvyplní předchozí uživatelovou volbou
- API klíč se načítá z `../Medevio/.env`
--- ---
+45 -5
View File
@@ -11,16 +11,30 @@ Pouziti:
""" """
import sys import sys
import os
import json import json
import base64 import base64
import io import io
import copy import copy
import tkinter as tk import tkinter as tk
from tkinter import filedialog
from pathlib import Path from pathlib import Path
from datetime import date from datetime import date
import fitz # pymupdf import fitz # pymupdf
import anthropic import anthropic
def _load_env():
env_path = Path(__file__).resolve().parent.parent / "Medevio" / ".env"
if env_path.exists():
for line in env_path.read_text(encoding="utf-8").splitlines():
line = line.strip()
if "=" in line and not line.startswith("#"):
k, v = line.split("=", 1)
os.environ[k.strip()] = v.strip()
_load_env()
HISTORY_FILE = Path(__file__).parent / "pojmenovani_historie.json" HISTORY_FILE = Path(__file__).parent / "pojmenovani_historie.json"
N_PAGES = 5 N_PAGES = 5
DPI = 120 # dostatecne pro cteni obsahu, nizke naklady na tokeny DPI = 120 # dostatecne pro cteni obsahu, nizke naklady na tokeny
@@ -151,12 +165,29 @@ def dialog(claude_suggestion: str) -> dict:
# ---------- hlavni logika ---------- # ---------- hlavni logika ----------
def pick_file() -> Path | None:
"""Otevre dialog pro vyber PDF souboru."""
root = tk.Tk()
root.withdraw()
root.attributes("-topmost", True)
chosen = filedialog.askopenfilename(
title="Vyber PDF k pojmenovani",
filetypes=[("PDF soubory", "*.pdf"), ("Vsechny soubory", "*.*")],
initialdir=Path(__file__).parent / "vystup",
)
root.destroy()
return Path(chosen) if chosen else None
def main(): def main():
if len(sys.argv) < 2: if len(sys.argv) < 2:
print(__doc__) pdf_path = pick_file()
sys.exit(1) if pdf_path is None:
print("Zadny soubor nebyl vybran.")
sys.exit(0)
else:
pdf_path = Path(sys.argv[1])
pdf_path = Path(sys.argv[1])
if not pdf_path.exists(): if not pdf_path.exists():
print(f"Soubor nenalezen: {pdf_path}") print(f"Soubor nenalezen: {pdf_path}")
sys.exit(1) sys.exit(1)
@@ -177,13 +208,22 @@ def main():
claude_name = ask_claude(images, history) claude_name = ask_claude(images, history)
print(f" Claude navrhuje: {claude_name}") print(f" Claude navrhuje: {claude_name}")
res = dialog(claude_name) # Pokud uz jsme tento soubor pojmenovavali (Claude navrhl stejne jmeno),
# predvyplnime dialog predchozi volbou uzivatele.
prefill = claude_name
for item in reversed(history):
if item["claude"] == claude_name:
prefill = item["user"]
print(f" Znamy dokument — predvyplnuji predchozi nazev: {prefill}")
break
res = dialog(prefill)
if res["cancelled"] or not res["name"]: if res["cancelled"] or not res["name"]:
print("Zruseno — soubor nebyl prejmenovan.") print("Zruseno — soubor nebyl prejmenovan.")
return return
user_name = res["name"] user_name = res["name"].replace("/", "-").replace("\\", "-").strip()
# uloz do historie # uloz do historie
history.append({"claude": claude_name, "user": user_name}) history.append({"claude": claude_name, "user": user_name})
+14
View File
@@ -0,0 +1,14 @@
[
{
"claude": "2026-05-18_bulletin-spl-cr-2-2026",
"user": "2026-05-18 Bulletin SPL ČR 02/2026 36. ročník"
},
{
"claude": "2026-05-18_bulletin-spl-cr-2-2026",
"user": "2026-05-18 Bulletin SPL ČR 02-2026 36. ročník"
},
{
"claude": "2026-05-18_navimow-i-series-quick-start-guide",
"user": "2026-05-18 Navimow i-series quick start guide"
}
]
+26 -6
View File
@@ -12,6 +12,7 @@ Pouziti:
import sys import sys
import copy import copy
from pathlib import Path
from pypdf import PdfReader, PdfWriter from pypdf import PdfReader, PdfWriter
from pypdf.generic import RectangleObject from pypdf.generic import RectangleObject
@@ -67,10 +68,29 @@ def rozloz(input_path, output_path):
if __name__ == "__main__": if __name__ == "__main__":
if len(sys.argv) < 2: BASE = Path(__file__).parent
print("Pouziti: python rozloz_brozuru.py <vstup.pdf> [vystup.pdf]") VSTUP = BASE / "vstup"
sys.exit(1) VYSTUP = BASE / "vystup"
VYSTUP.mkdir(exist_ok=True)
inp = sys.argv[1] if len(sys.argv) >= 2:
out = sys.argv[2] if len(sys.argv) > 2 else inp.replace(".pdf", "_serazena.pdf") # explicitni argumenty zachovany pro zpetnou kompatibilitu
rozloz(inp, out) inp = sys.argv[1]
out = sys.argv[2] if len(sys.argv) > 2 else inp.replace(".pdf", "_serazena.pdf")
rozloz(inp, out)
else:
pdfs = [f for f in VSTUP.glob("*.pdf") if "[ZPRACOVANO]" not in f.name]
if not pdfs:
print("Zadne PDF soubory ke zpracovani ve vstup/")
sys.exit(0)
for pdf in pdfs:
out = VYSTUP / (pdf.stem + "_serazena.pdf")
print(f"\n=== {pdf.name} ===")
try:
rozloz(str(pdf), str(out))
done = pdf.with_name(pdf.stem + " [ZPRACOVANO]" + pdf.suffix)
pdf.rename(done)
print(f"Vstupni soubor oznacen: {done.name}")
except Exception as e:
print(f"CHYBA: {e}")