V3.6.0 — Demonter pages, masquage visuel, regles, bleeds, corrections

- Demonter les pages : couper en 2 sans reordonner (sous Delivretiser)
- Masquage visuel : selection au curseur sur l'apercu + plage de pages
- Regles horizontale/verticale en mm (menu Affichage)
- Fonds perdus : filigrane rouge pour visualiser les bleeds
- Reperes de coupe : marques a l'exterieur (page agrandie), 2 traits/coin
- Numerotation : couleur configurable via selecteur
- Decalage : Trim & Shift renomme en francais, creep -> chasse
- Recadrages multiples cumulatifs (plages differentes)
- Fix spinbox format personnalise (fleches aleatoires)
- Fix combo livret : option Automatique preservee

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jules
2026-03-29 22:12:54 +02:00
parent f7ad806b26
commit 202834a794
13 changed files with 675 additions and 113 deletions

View File

@@ -5,36 +5,50 @@ 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):
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:
if pages is None and per_page_settings is None:
pages = list(range(len(reader.pages)))
for i, page in enumerate(reader.pages):
if i in pages:
w, h = get_page_size(page)
new_left = float(page.mediabox.left) + crop_left
new_bottom = float(page.mediabox.bottom) + crop_bottom
new_right = float(page.mediabox.right) - crop_right
new_top = float(page.mediabox.top) - crop_top
# 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
# Securite
if new_right <= new_left or new_top <= new_bottom:
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
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
# 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)