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

View File

@@ -23,6 +23,7 @@ from app.dialogs.page_numbers_dialog import PageNumbersDialog
from app.dialogs.masking_dialog import MaskingDialog
from app.dialogs.bleeds_dialog import BleedsDialog
from app.dialogs.crop_marks_dialog import CropMarksDialog
from app.dialogs.crop_dialog import CropDialog
from app.engine.booklet import create_booklet
from app.engine.nup import nup_pages
@@ -34,6 +35,7 @@ from app.engine.page_numbers import add_page_numbers
from app.engine.masking import apply_masking
from app.engine.bleeds import define_bleeds
from app.engine.crop_marks import add_crop_marks, remove_crop_marks
from app.engine.crop import crop_pages
class MainWindow(QMainWindow):
@@ -100,6 +102,7 @@ class MainWindow(QMainWindow):
file_menu = menubar.addMenu("Fichier")
self._add_action(file_menu, "Ouvrir PDF...", "Ctrl+O", self._open_file)
self._add_action(file_menu, "Enregistrer le resultat...", "Ctrl+S", self._save_result)
self._add_action(file_menu, "Imprimer...", "Ctrl+P", self._do_print)
file_menu.addSeparator()
self._add_action(file_menu, "Fusionner des PDF...", "Ctrl+M", self._do_merge)
file_menu.addSeparator()
@@ -115,6 +118,8 @@ class MainWindow(QMainWindow):
# Pages
pages_menu = menubar.addMenu("Pages")
self._add_action(pages_menu, "Recadrer...", None, self._do_crop)
pages_menu.addSeparator()
self._add_action(pages_menu, "Inserer des pages blanches", None, self._do_insert_blank)
# Annotations
@@ -494,6 +499,42 @@ class MainWindow(QMainWindow):
self._hide_progress()
QMessageBox.critical(self, "Erreur", str(e))
def _do_crop(self):
if not self._require_file():
return
from pypdf import PdfReader
from app.engine.pdf_utils import get_page_size
reader = PdfReader(self._current_file)
page = reader.pages[self._viewer.current_page]
w, h = get_page_size(page)
dlg = CropDialog(
page_width_pt=w, page_height_pt=h,
total_pages=len(reader.pages),
current_page=self._viewer.current_page,
parent=self
)
if dlg.exec():
self._show_progress()
settings = dlg.get_settings()
output = self._make_temp()
try:
crop_pages(self._current_file, output, **settings)
self._show_result(output)
except Exception as e:
self._hide_progress()
QMessageBox.critical(self, "Erreur", str(e))
def _do_print(self):
if not self._require_file():
return
import subprocess
try:
source = self._result_file or self._current_file
subprocess.Popen(["cmd", "/c", "start", "", source], shell=True)
self._status_label.setText("Ouverture pour impression...")
except Exception as e:
QMessageBox.critical(self, "Erreur", f"Impossible d'imprimer :\n{e}")
def _do_crop_marks(self):
if not self._require_file():
return