"""Moteur Recadrage de pages.""" from pypdf import PdfReader, PdfWriter from .pdf_utils import get_page_size def crop_pages(input_path, output_path, crop_top=0, crop_bottom=0, crop_left=0, crop_right=0, pages=None, per_page_settings=None): """Recadrer les pages specifiees. crop_top/bottom/left/right : en points, quantite a retirer de chaque cote pages : liste d'indices (0-based) des pages a recadrer. None = toutes. per_page_settings : dict {page_index: {"crop_top", "crop_bottom", "crop_left", "crop_right"}} Si fourni, applique des reglages differents par page. """ reader = PdfReader(input_path) writer = PdfWriter() if pages is None and per_page_settings is None: pages = list(range(len(reader.pages))) for i, page in enumerate(reader.pages): # Verifier si on a des reglages specifiques pour cette page if per_page_settings and i in per_page_settings: ps = per_page_settings[i] ct = ps.get("crop_top", 0) cb = ps.get("crop_bottom", 0) cl = ps.get("crop_left", 0) cr = ps.get("crop_right", 0) elif pages is not None and i in pages: ct, cb, cl, cr = crop_top, crop_bottom, crop_left, crop_right else: writer.add_page(page) continue w, h = get_page_size(page) new_left = float(page.mediabox.left) + cl new_bottom = float(page.mediabox.bottom) + cb new_right = float(page.mediabox.right) - cr new_top = float(page.mediabox.top) - ct # Securite if new_right <= new_left or new_top <= new_bottom: writer.add_page(page) continue page.mediabox.lower_left = (new_left, new_bottom) page.mediabox.upper_right = (new_right, new_top) page.cropbox = page.mediabox if hasattr(page, 'trimbox'): page.trimbox = page.mediabox writer.add_page(page) with open(output_path, "wb") as f: writer.write(f) return output_path