File size: 2,810 Bytes
1b801d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"""
Crea data/samples/testamento_writer00.png

Documento composto da campioni reali di grafia writer_00 (opzione A).
Corpo testo: campioni writer_00/sample_*.png impilati verticalmente.
Firma: CEDAR original_1_1.png (writer_00) + etichetta "Luca Rossi".
"""

from pathlib import Path
from PIL import Image, ImageDraw, ImageFont

ROOT    = Path(__file__).parent.parent
SAMPLES = ROOT / "data/samples/writer_00"
FIRMA   = ROOT / "data/cedar/signatures/full_org/original_1_1.png"
OUT_IMG = ROOT / "data/samples/testamento_writer00.png"

# Campioni selezionati (indici diversi = frasi diverse)
SELECTED = [0, 4, 8, 12, 18, 25]

PAGE_W      = 1800
MARGIN_X    = 130
MARGIN_TOP  = 100
GAP         = 45     # spazio verticale tra campioni
SIG_GAP     = 90     # spazio prima della firma
SIG_H       = 170    # altezza target firma
MARGIN_BOT  = 100


def load_sample(idx: int, target_w: int) -> Image.Image:
    path = SAMPLES / f"sample_{idx:03d}.png"
    img  = Image.open(path).convert("L")
    scale = target_w / img.width
    new_h = int(img.height * scale)
    img   = img.resize((target_w, new_h), Image.LANCZOS)
    rgb   = img.convert("RGB")
    # assicura sfondo bianco
    return rgb


def main() -> None:
    available = sorted(SAMPLES.glob("sample_*.png"))
    max_idx   = len(available) - 1
    indices   = [i for i in SELECTED if i <= max_idx]

    text_w  = PAGE_W - 2 * MARGIN_X
    samples = [load_sample(i, text_w) for i in indices]

    # Altezza canvas
    body_h  = sum(s.height for s in samples) + GAP * (len(samples) - 1)
    page_h  = MARGIN_TOP + body_h + SIG_GAP + SIG_H + MARGIN_BOT

    canvas  = Image.new("RGB", (PAGE_W, page_h), (255, 255, 255))

    # Incolla campioni
    y = MARGIN_TOP
    for samp in samples:
        canvas.paste(samp, (MARGIN_X, y))
        y += samp.height + GAP

    # Firma CEDAR writer_1
    sig = Image.open(FIRMA).convert("RGBA")
    scale  = SIG_H / sig.height
    sig_w  = int(sig.width * scale)
    sig    = sig.resize((sig_w, SIG_H), Image.LANCZOS)

    sig_bg = Image.new("RGB", sig.size, (255, 255, 255))
    sig_bg.paste(sig, mask=sig.split()[3])

    sig_x = PAGE_W - sig_w - MARGIN_X
    sig_y = y + SIG_GAP
    canvas.paste(sig_bg, (sig_x, sig_y))

    # Etichetta "Luca Rossi"
    draw = ImageDraw.Draw(canvas)
    try:
        font = ImageFont.truetype("inkfree.ttf", size=46)
    except (IOError, OSError):
        try:
            font = ImageFont.truetype("C:/Windows/Fonts/inkfree.ttf", size=46)
        except (IOError, OSError):
            font = ImageFont.load_default()

    lx = sig_x + sig_w // 2
    ly = sig_y + SIG_H + 8
    draw.text((lx, ly), "Luca Rossi", fill=(50, 50, 50), font=font, anchor="mt")

    canvas.save(OUT_IMG, "PNG")
    print(f"Creato: {OUT_IMG}  ({PAGE_W}x{page_h}px)")


if __name__ == "__main__":
    main()