param( [string]$InputFile = "C:\Temp\git\PS-SetEtikettSorte\500GrammEtikett.psd", [Parameter(Mandatory)] [string]$Sorte, [string]$Sorte2, [Parameter(Mandatory)] [string]$Datum ) # --- Encoding --- [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 # --- Photoshop starten --- $ps = New-Object -ComObject Photoshop.Application $ps.Visible = $false $ps.Preferences.RulerUnits = 1 # Pixel # --- Helper: Dateiname säubern --- function Sanitize-FileName($name) { if (-not $name) { return "" } $name = $name -replace '[\\/:*?"<>|]', '_' $name = $name -replace '\s+', '-' $name = $name -replace '&', '-' return $name } # --- Datum umwandeln --- $parsedDate = [datetime]::ParseExact($Datum, "dd.MM.yyyy", $null) $OutDate = $parsedDate.ToString("yyyy-MM-dd") $SorteSafe = Sanitize-FileName $Sorte $Sorte2Safe = Sanitize-FileName $Sorte2 # --- PSD öffnen --- $doc = $ps.Open($InputFile) # --- Text setzen --- try { $doc.ArtLayers.GetByName("Sorte").TextItem.Contents = "Deutscher $Sorte" } catch {} try { $layer2 = $doc.ArtLayers.GetByName("Sorte2") if (-not [string]::IsNullOrWhiteSpace($Sorte2)) { $layer2.TextItem.Contents = "mit $Sorte2" } else { $layer2.TextItem.Contents = "" } } catch {} try { $doc.ArtLayers.GetByName("Datum").TextItem.Contents = $Datum } catch {} # --- Output Name --- if ($Sorte2Safe) { $OutputFile = "C:\Temp\git\PS-SetEtikettSorte\${OutDate}_${SorteSafe}_mit_${Sorte2Safe}.jpg" } else { $OutputFile = "C:\Temp\git\PS-SetEtikettSorte\${OutDate}_${SorteSafe}.jpg" } # --- Export Einzeletikett --- $doc.Export($OutputFile, 2) $doc.Close(2) # ===================================================== # ================== A4 GENERIERUNG =================== # ===================================================== $A4Template = "C:\Temp\git\PS-SetEtikettSorte\Druckvorlage_A4.psd" $docA4 = $ps.Open($A4Template) # --- Helper: Bild einfügen --- function Place-Image { param($file, $targetDoc) $imgDoc = $ps.Open($file) $imgDoc.Selection.SelectAll() $imgDoc.Selection.Copy() $imgDoc.Close(2) $ps.ActiveDocument = $targetDoc $targetDoc.Paste() return $targetDoc.ActiveLayer } # --- Größe ermitteln --- $ps.ActiveDocument = $docA4 $layer = Place-Image $OutputFile $docA4 $bounds = $layer.Bounds $width = [int]$bounds[2] - [int]$bounds[0] $height = [int]$bounds[3] - [int]$bounds[1] # löschen (sauber) $ps.ActiveDocument = $docA4 $layer = $docA4.ActiveLayer if ($layer) { $layer.Delete() } # --- Grid Parameter --- $cols = 1 $rows = 6 $gapX = 60 $gapY = 100 $offsetX = 100 $offsetY = 100 # --- Platzierung --- for ($r = 0; $r -lt $rows; $r++) { for ($c = 0; $c -lt $cols; $c++) { $ps.ActiveDocument = $docA4 #Place-Image $OutputFile $docA4 [void](Place-Image $OutputFile $docA4) $layer = $docA4.ActiveLayer $bounds = $layer.Bounds $currentX = [int]$bounds[0] $currentY = [int]$bounds[1] $targetX = $offsetX + ($c * ($width + $gapX)) $targetY = $offsetY + ($r * ($height + $gapY)) $moveX = $targetX - $currentX $moveY = $targetY - $currentY $docA4.ActiveLayer = $layer $layer.Translate($moveX, $moveY) } } # --- Final Output --- if ($Sorte2Safe) { $FinalOutput = "C:\Temp\git\PS-SetEtikettSorte\${OutDate}_A4_${SorteSafe}_mit_${Sorte2Safe}.jpg" } else { $FinalOutput = "C:\Temp\git\PS-SetEtikettSorte\${OutDate}_A4_${SorteSafe}.jpg" } $ps.ActiveDocument = $docA4 $docA4.Export($FinalOutput, 2) $docA4.Close(2) $ps.Quit()