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