""" Przygotowanie szablonu PSD "Akrylowe zaproszenie ślubne dla rodziców ze zdjęciem - Wzór 5": 1) konwersja warstwy rastrowej "zdjecie" do Smart Object (newPlacedLayer) 2) rename warstw na czytelne nazwy 3) wyczyszczenie tekstu warstwy "Magdalena i Robert..." z doklejonej daty 4) zapis PSD (zachowuje oryginal — nadpisuje plik szablonu) """ import sys, os os.environ.setdefault('PYTHONIOENCODING', 'utf-8') sys.stdout.reconfigure(encoding='utf-8') import photoshop.api as ps PSD = r"d:\pomysloweprezenty.pl\projekty\ślub - zaproszenia\Akrylowe zaproszenie ślubne dla rodziców ze zdjęciem - Wzór 5\Akrylowe zaproszenie ślubne dla rodziców ze zdjęciem - Wzór 5.psd" app = ps.Application() doc = app.open(PSD) print(f'Otwarto: {doc.name}') w1 = doc.layerSets["Warstwa 1"] # Mapowanie: stara_nazwa_lub_kontent -> nowa_nazwa RENAMES = { "Kochani Rodzice": "naglowek", "27.06.2026": "data", } # Znajdz warstwy po prefiksie nazwy (długie nazwy z spacjami / niepełne) def find_by_prefix(container, prefix): for al in container.artLayers: if al.name.startswith(prefix): return al return None # 1) Czyszczenie tekstu "Magdalena i Robert..." -> "Magdalena i Robert" (artefakt z doklejona data) imiona_layer = find_by_prefix(w1, "Magdalena i Robert") if imiona_layer is not None: print(f'Czyszczenie tekstu warstwy: "{imiona_layer.name[:40]}..."') print(f' przed: "{imiona_layer.textItem.contents}"') # zachowaj srodek bounds b = [float(x) for x in imiona_layer.bounds] cx, cy = (b[0]+b[2])/2, (b[1]+b[3])/2 imiona_layer.textItem.contents = "Magdalena i Robert" b2 = [float(x) for x in imiona_layer.bounds] cx2, cy2 = (b2[0]+b2[2])/2, (b2[1]+b2[3])/2 if cx-cx2 or cy-cy2: imiona_layer.translate(cx-cx2, cy-cy2) print(f' po: "{imiona_layer.textItem.contents}"') imiona_layer.name = "imiona_pary" print(f' rename -> imiona_pary') # 2) Życzenia (długi tekst) zycz = find_by_prefix(w1, "Jest jedna miłość") if zycz is not None: zycz.name = "zyczenia" print(f'rename "Jest jedna miłość..." -> zyczenia') # 3) Pozostale rename for old, new in RENAMES.items(): try: l = w1.artLayers[old] l.name = new print(f'rename "{old}" -> {new}') except Exception as e: print(f' brak warstwy "{old}": {e}') # 4) Konwersja warstwy "zdjecie" (raster) -> Smart Object # placedLayerMakeFromLayer ('newPlacedLayer') konwertuje zaznaczona warstwe do SO zdj = w1.artLayers["zdjecie"] doc.activeLayer = zdj print(f'\nKonwersja "zdjecie" do Smart Object...') desc = ps.ActionDescriptor() app.executeAction(app.stringIDToTypeID("newPlacedLayer"), desc, ps.DialogModes.DisplayNoDialogs) # active layer po konwersji to SO o tej samej nazwie new_zdj = doc.activeLayer print(f' warstwa po konwersji: name="{new_zdj.name}" kind={new_zdj.kind}') # 5) Zapis print('\nZapis PSD...') psd_opts = ps.PhotoshopSaveOptions() doc.saveAs(PSD, psd_opts, True) print(f'Zapisano: {PSD}') doc.close(ps.SaveOptions.DoNotSaveChanges) print('DONE')