""" Generator PSD - Prosba o bycie chrzestnym (zlota plexi UV). Szablon A3 ma dwa warianty: - DP (Ojciec Chrzestny): DP/Tekst/[imie_dziecka, wolacz, pytanie, tresc] - DL (Matka Chrzestna): DL/[imie_dziecka, wolacz, pytanie, tresc] Skrypt akceptuje oba zestawy parametrow (matka / ojciec) — kazdy opcjonalny, minimum jeden wymagany. Niewykorzystany wariant zostanie ukryty (visible=False). Wymaga: uruchomiony Adobe Photoshop, photoshop-python-api. """ import argparse import os import sys import photoshop.api as ps PROJEKT_DIR = os.path.join( r"d:\pomysloweprezenty.pl\projekty\chrzest - prośby o bycie chrzestnym", "złota plexi z nadrukiem UV", ) SZABLON_PATH = os.path.join(PROJEKT_DIR, "prośba UV - makieta A3 CMYK.psd") GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe") def set_text(layer, new_text): """Zmienia tekst warstwy zachowujac srodek bounding boxa (centrowane warstwy).""" b = [float(x) for x in layer.bounds] cx, cy = (b[0] + b[2]) / 2, (b[1] + b[3]) / 2 layer.textItem.contents = new_text b2 = [float(x) for x in layer.bounds] cx2, cy2 = (b2[0] + b2[2]) / 2, (b2[1] + b2[3]) / 2 dx, dy = cx - cx2, cy - cy2 if dx or dy: layer.translate(dx, dy) def set_layer_text(container, layer_name, new_text): if new_text is None: return layer = container.artLayers[layer_name] old = layer.textItem.contents set_text(layer, new_text) print(f' {layer_name}: "{old[:40]}..." -> "{new_text[:40]}..."') def fill_wariant(container, imie_dziecka, wolacz, tresc): set_layer_text(container, "imie_dziecka", imie_dziecka) set_layer_text(container, "wolacz", wolacz) set_layer_text(container, "tresc", tresc) def generate(klient, imie_dziecka, matka_wolacz=None, ojciec_wolacz=None, tresc=None): if not matka_wolacz and not ojciec_wolacz: print("BLAD: podaj co najmniej jeden z --matka-wolacz / --ojciec-wolacz") sys.exit(1) os.makedirs(GOTOWE_DIR, exist_ok=True) output_path = os.path.join(GOTOWE_DIR, f"{klient}.psd") app = ps.Application() doc = app.open(SZABLON_PATH) print(f"Otwarto szablon: {doc.name}") try: # DP = ojciec dp = doc.layerSets["DP"] if ojciec_wolacz: print(" [DP] ojciec chrzestny:") dp.visible = True fill_wariant(dp.layerSets["Tekst"], imie_dziecka, ojciec_wolacz, tresc) else: print(" [DP] ukryte (brak --ojciec-wolacz)") dp.visible = False # DL = matka dl = doc.layerSets["DL"] if matka_wolacz: print(" [DL] matka chrzestna:") dl.visible = True fill_wariant(dl, imie_dziecka, matka_wolacz, tresc) else: print(" [DL] ukryte (brak --matka-wolacz)") dl.visible = False psd_opts = ps.PhotoshopSaveOptions() doc.saveAs(output_path, psd_opts, True) print(f"Zapisano: {output_path}") finally: app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges) print("Gotowe!") return output_path def main(): parser = argparse.ArgumentParser( description="Generator PSD - Prosba o bycie chrzestnym (zlota plexi UV)" ) parser.add_argument("--klient", required=True, help="Nazwa pliku wyjsciowego") parser.add_argument("--imie-dziecka", dest="imie_dziecka", required=True, help="Imie dziecka (np. Nela)") parser.add_argument("--matka-wolacz", dest="matka_wolacz", default=None, help='Wolacz dla matki chrzestnej (np. "Ciociu Kasiu")') parser.add_argument("--ojciec-wolacz", dest="ojciec_wolacz", default=None, help='Wolacz dla ojca chrzestnego (np. "Wujku Darku")') parser.add_argument("--tresc", default=None, help="Tresc prosby (opcjonalnie, domyslnie z szablonu). Wspolna dla obu wariantow.") args = parser.parse_args() generate( klient=args.klient, imie_dziecka=args.imie_dziecka, matka_wolacz=args.matka_wolacz, ojciec_wolacz=args.ojciec_wolacz, tresc=args.tresc, ) if __name__ == "__main__": main()