""" Rozlozi naskenovanou brozuru do PDF se strankami razenymi od 1. Predpoklady: - Kazda PDF stranka obsahuje dve stranky brozury vedle sebe (leva + prava). - Sken probĂ­hal duplexne od stredoveho listu smerem ven. - Stredove stranky se odvodi automaticky z poctu PDF stranek. Pouziti: python rozloz_brozuru.py [vystup.pdf] """ import sys import copy from pathlib import Path from pypdf import PdfReader, PdfWriter from pypdf.generic import RectangleObject def rozloz(input_path, output_path): reader = PdfReader(input_path) n_pdf = len(reader.pages) center_left = n_pdf # napr. 12 nebo 40 center_right = n_pdf + 1 # napr. 13 nebo 41 total_pages = n_pdf * 2 # celkovy pocet stran brozury print(f"PDF stranek : {n_pdf}") print(f"Stran brozury: {total_pages} (stred: {center_left}+{center_right})") # Mapovani: brozurova strana -> (pdf_idx 0-based, 'L'/'P') page_map = {} n_sheets = n_pdf // 2 for k in range(n_sheets): front_pdf = 2 * k back_pdf = 2 * k + 1 page_map[center_left - 2 * k] = (front_pdf, 'L') page_map[center_right + 2 * k] = (front_pdf, 'P') page_map[center_right + 2 * k + 1] = (back_pdf, 'L') page_map[center_left - 2 * k - 1] = (back_pdf, 'P') writer = PdfWriter() for bp in range(1, total_pages + 1): pdf_idx, lr = page_map[bp] src = reader.pages[pdf_idx] width = float(src.mediabox.width) height = float(src.mediabox.height) half_w = width / 2 new_page = copy.copy(src) if lr == 'L': box = RectangleObject([0, 0, half_w, height]) else: box = RectangleObject([half_w, 0, width, height]) new_page.mediabox = box new_page.cropbox = box writer.add_page(new_page) with open(output_path, "wb") as f: writer.write(f) print(f"Hotovo: {output_path} ({total_pages} stranek)") if __name__ == "__main__": BASE = Path(__file__).parent VSTUP = BASE / "vstup" VYSTUP = BASE / "vystup" VYSTUP.mkdir(exist_ok=True) if len(sys.argv) >= 2: # explicitni argumenty zachovany pro zpetnou kompatibilitu 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}")