V2.2.0 — Recadrage + Impression

- Recadrage de pages (Pages > Recadrer) :
  - Mode marges : retirer X mm de chaque cote
  - Mode taille finale : definir la taille souhaitee (centrage auto)
  - Apercu en temps reel de la dimension finale
  - Appliquer a : page courante, toutes, paires, impaires, plage
  - Plage de pages personnalisee (ex: 1-3, 5, 8-10)
- Impression (Fichier > Imprimer / Ctrl+P) : ouvre le PDF dans le viewer par defaut

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jules
2026-03-21 13:34:22 +01:00
parent c9212a30ea
commit 500309ed53
5 changed files with 316 additions and 2 deletions

43
app/engine/crop.py Normal file
View File

@@ -0,0 +1,43 @@
"""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):
"""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.
"""
reader = PdfReader(input_path)
writer = PdfWriter()
if pages 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
# 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