Automatic orientation issues detection and fix, experimental

This commit is contained in:
sebastien committed 2026-10-13 22:27:41 +02:00
1 parent 78a7b7679c
commit 46845c4612
12 files changed
+683 -9

No files matched your search

+9
View File
@@ -10,6 +10,7 @@ import signal
import shutil
import tempfile
import cv2
import pymupdf
from collections.abc import Sequence
from pathlib import Path
@@ -17,6 +18,7 @@ from copienator.cli import CliError, ExitCode, execute, target_parser, workspace
from copienator.crop_blank_margins import process_pdf
from copienator.filesystem import staged_files
from copienator.workspace import EvaluationWorkspace
from copienator.orientation import load_provenance, save_provenance
def selected_files(workspace: EvaluationWorkspace, target: Path) -> list[Path]:
@@ -112,6 +114,10 @@ def run(workspace: EvaluationWorkspace, target: Path, *, workers: int = 5) -> Ex
raise CliError("Aucun PDF trouvé dans Copies.", ExitCode.INVALID_ARGUMENTS)
# Prepare the whole batch before replacing any copy. A detection failure or
# interruption leaves the working PDFs intact; commit errors roll back.
origins = {}
for source in files:
with pymupdf.open(source) as document:
origins[source.name] = load_provenance(workspace, source, len(document))
with staged_files(workspace.copies_dir) as staging:
records = process_copies(files, staging, workers)
# Detect edits made while the batch was being analysed, before saving
@@ -129,6 +135,9 @@ def run(workspace: EvaluationWorkspace, target: Path, *, workers: int = 5) -> Ex
(backup/"report.json").write_text(json.dumps(records, ensure_ascii=False, indent=2),
encoding="utf-8")
print(f"Sauvegarde des PDF non rognés : {originals}", flush=True)
for source in files:
if origins[source.name] is not None:
save_provenance(workspace, source, origins[source.name])
cropped, mean_percentage, over_thirty = crop_statistics(records)
print(f"Terminé : {cropped}/{len(records)} pages rognées ; "
f"{len(files)} PDF remplacés dans Copies.", flush=True)