""" 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 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__": if len(sys.argv) < 2: print("Pouziti: python rozloz_brozuru.py [vystup.pdf]") sys.exit(1) inp = sys.argv[1] out = sys.argv[2] if len(sys.argv) > 2 else inp.replace(".pdf", "_serazena.pdf") rozloz(inp, out)