Spaces:
Running
Running
| """ | |
| 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() | |