Files
ordinaceprojekt/SběrDatRůzné/SudokuKiller/Testy/21_CropRayCast.py
T
2026-05-06 13:24:43 +02:00

62 lines
2.1 KiB
Python

"""
Crop Killer Sudoku PDF ray-casting metodou:
1. Horizontální paprsek na y_mid → najde x_left, x_right mřížky
2. Vertikální paprsek podél x_left → najde top_cut, bot_cut mřížky
Výsledek: oříznuté PDF jen s mřížkou + malý bílý rámeček (MARGIN).
"""
import fitz
from pathlib import Path
MARGIN = 4 # pt bílého rámečku kolem mřížky
SRC = Path(r"U:/ordinaceprojekt/SběrDatRůzné/SudokuKiller/Testy/2009-05-04 Puzzle SudokuKiller 376 [difficulty 4 of 10] [average solving time 30 min].pdf")
DST = Path(r"U:/ordinaceprojekt/SběrDatRůzné/SudokuKiller/Testy/cropped_raycast.pdf")
def crop_raycast(src_path: Path, dst_path: Path, margin: float = MARGIN):
doc = fitz.open(str(src_path))
page = doc[0]
paths = page.get_drawings()
pw = page.mediabox.width
ph = page.mediabox.height
y_mid = ph / 2
# Krok 1: horizontální paprsek na y_mid → x_left, x_right
hit_h = [p["rect"] for p in paths if p["rect"].y0 <= y_mid <= p["rect"].y1]
if not hit_h:
raise ValueError("Horizontální paprsek nenašel žádné kresby na y_mid")
# Elementy z horizontálního paprsku jsou výhradně mřížka (nadpis/copyright
# jsou daleko od y_mid) — jejich y rozsah přímo dává top/bot hranici mřížky.
x_left = min(r.x0 for r in hit_h)
x_right = max(r.x1 for r in hit_h)
top_cut = min(r.y0 for r in hit_h)
bot_cut = max(r.y1 for r in hit_h)
print(f"x_left={x_left:.1f} x_right={x_right:.1f}")
print(f"top_cut={top_cut:.1f} bot_cut={bot_cut:.1f}")
print(f"stránka: {pw:.1f} x {ph:.1f} pt")
clip = fitz.Rect(
x_left - margin,
top_cut - margin,
x_right + margin,
bot_cut + margin,
)
clip_w = clip.width
clip_h = clip.height
doc_new = fitz.open()
p = doc_new.new_page(width=clip_w, height=clip_h)
p.show_pdf_page(fitz.Rect(0, 0, clip_w, clip_h), doc, 0, clip=clip)
doc_new.save(str(dst_path))
doc.close()
doc_new.close()
print(f"Uloženo: {dst_path} ({clip_w:.1f} x {clip_h:.1f} pt)")
crop_raycast(SRC, DST)