When no margin detected, reserve a bit more space for comments

This commit is contained in:
sebastien committed 2026-10-13 21:23:48 +02:00
1 parent e7094d850e
commit 78a7b7679c
17 files changed
+357 -28

No files matched your search

+11 -8
View File
@@ -35,9 +35,9 @@ from copienator.commands.import_annotations import clear_import_directory
from copienator.answer_info import build_answer_info
from copienator.filesystem import staged_directory
from copienator.feedback_boxes import valid_feedback_box
from copienator.annotation_layout import layout_for
from copienator.utils import natural_key
MARGIN_LEFT = 300
ANNOT_WIDTH = 600
@@ -321,7 +321,7 @@ def compose_label_image(base_img, label, result, hmin,
with_error=True,
with_empty=False,
more_right=False,
with_id=None, source_pdf=None):
with_id=None, source_pdf=None, layout=None):
"""
Composes the final image with annotations.
@@ -350,10 +350,12 @@ def compose_label_image(base_img, label, result, hmin,
context = f"Copie : {with_id} — {context}"
raise AnnotationLatexError(f"{context}\n{exc}") from exc
layout = dict(layout if layout is not None else layout_for(source_pdf))
margin_left = layout['margin_left']
left_pad = 0
if base_img.width < TARGET_MIN_WIDTH:
total_missing = TARGET_MIN_WIDTH - base_img.width
left_pad = min(total_missing, MARGIN_LEFT)
left_pad = min(total_missing, layout['narrow_left_pad_limit'])
new_base = Image.new("RGB", (TARGET_MIN_WIDTH, base_img.height), "white")
new_base.paste(base_img, (left_pad, 0))
@@ -409,7 +411,7 @@ def compose_label_image(base_img, label, result, hmin,
total_height = base_img.height + header_height
# Create Canvas
final_img = Image.new("RGB", (base_img.width + MARGIN_LEFT, total_height), "white")
final_img = Image.new("RGB", (base_img.width + margin_left, total_height), "white")
# Draw Headers
current_y = 0
@@ -431,7 +433,7 @@ def compose_label_image(base_img, label, result, hmin,
# Paste Base Image
image_offset_y = current_y
final_img.paste(base_img, (MARGIN_LEFT, image_offset_y))
final_img.paste(base_img, (margin_left, image_offset_y))
# 2. Draw Local Annotations
draw = ImageDraw.Draw(final_img, "RGBA") # Refresh draw object
@@ -443,8 +445,8 @@ def compose_label_image(base_img, label, result, hmin,
target_ymin = (ymin - hmin) + image_offset_y
target_ymax = (ymax - hmin) + image_offset_y
target_xmin = xmin + MARGIN_LEFT + left_pad
target_xmax = xmax + MARGIN_LEFT + left_pad
target_xmin = xmin + margin_left + left_pad
target_xmax = xmax + margin_left + left_pad
# Draw Rectangle (if not suppressed)
if "norectangle" not in fb:
@@ -485,6 +487,7 @@ def compose_label_image(base_img, label, result, hmin,
last_text_bottom = paste_y + txt_img.height
final_img.info['annotation_layout'] = layout
return final_img, header_height
def process_student(student_id, labels_data, root_dir, all_labels, overwrite):
@@ -544,7 +547,7 @@ def process_student(student_id, labels_data, root_dir, all_labels, overwrite):
if label_images:
max_w = max(image.width for image in label_images)
total_h = sum(image.height for image in label_images)
canvas = Image.new('RGB', (max_w, total_h))
canvas = Image.new('RGB', (max_w, total_h), 'white')
current_y = 0
for image in label_images:
canvas.paste(image, (0, current_y))