batchanfaenger
Goto Top

PDFs mit fast gleichem Namen zusammenfügen und neu benennen

Liebe Community,
obwohl ich schon überall gegoogelt und auch Diverses ausprobiert habe, ergibt sich für mich ein scheinbar unlösbares Problem. Ich bin wirklich ein Anfänger und scheinbar auch ohne Plan B !!!
Ich brauche ein Batch-Datei oder Ähnliches, was mir bei meiner Arbeit wirklich viel Zeit ersparen würde und meine aktuelle Frustgrenze wieder spürbar anhebt.
Folgendes Problem liegt vor:
Auf meinem H: Laufwerk habe ich in der Datei "LS06_2018" ca. 8000 pdf-Dateien. Die Namen der Dateien bestehen immer aus Zahlen plus einer mit Bindestrich oder auch mit Klammern ergänzten Zahl.
Zum Beispiel:
1062158-1.pdf
1063503(1).pdf

Zudem gibt es diese Dateien ein zweites mal, immer mit dem Anhang "-2" bzw "(2)".
Zum Beispiel:
1062158-2.pdf
1063503(2).pdf

Nun sollen die Dateien mit der selben Hauptnummer als eine pdf-Datei zusammen gefügt werden und die Endung "-S2" erhalten, z.B:
1062158-1.pdf + 1062158-2.pdf = 1062158-S2.pdf
1063503(1).pdf + 1063503(2).pdf = 1063503(S2).pdf

Die Dateien alle einzeln zusamenzufügen und neu zu benennen lässt mich aufgrund der dabei auftretenden Fehlerhäufigkeit schon fast ergrauen!!!
Zur oben genannten Problematik kommt noch erschwerend hinzu, das die Zahlenfolgen nicht immer fortlaufend sind bzw. auch Zahlensprünge aufweisen.
Ich hoffe das es hier einen Profi gibt, welcher über das Problem nur lächelt und mir eine pasende Lösung aufzeigen kann.
Bitte habt ein Nachsehen bei meiner Fragestellung, aber ich habe bei der bisherigen Lösung scheinbar keinen guten Start im neuen Jahr 2021 erwischt.
Danke schon mal im Voraus für Eure Tipps, Tricks und Lösungsvorschläge!!!
Falls es hilft, als einfliesbare Software steht mir Adobe Acrobat DC zur Verfügung - lade aber auch gerne etwas anderes aus dem Netz herunter, wenn es doch nur helfen würde.
Gruss
Batchanfaenger

Content-ID: 636838

Url: https://administrator.de/forum/pdfs-mit-fast-gleichem-namen-zusammenfuegen-und-neu-benennen-636838.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

SeaStorm
SeaStorm 02.01.2021 um 00:05:57 Uhr
Goto Top
Hi

Ich würde ja vorschlagen erst mal die Dateinamen gerade zu ziehen ... aber naja


Unter der Voraussetzung das du das Modul PSWritePDF verwenden kannst sollte das so halbwegs passen:


$searchpath = "c:\temp"  
$destinationdir = "c:\temp\neu"  

if (Get-Module -ListAvailable -Name PSWritePDF) {
    Write-Host "PSWritePDF Module exists"  
} 
else {
    Install-Module PSWritePDF -Force
}

$uniquenames = gci -Path $searchpath -File -Filter "*.pdf" | % {$_.BaseName.Substring(0,7)} | Sort -Unique  

foreach ($uname in $uniquenames) {

#Die mit Bindestrich abarbeiten
$files = gci -Path $searchpath -File -Filter "$($uname)-*.pdf"  
$filecount = ($files | Measure-Object).Count
if ($filecount -eq 2) {
        write-host "$uname - : "  
        Merge-PDF -InputFile $files.FullName, $files[1].FullName -OutputFile "$destinationdir\$uname-S2.pdf"  
        Write-Host "`t Merged" -ForegroundColor Green  
    } else {
        if ($filecount -ne 0){Write-Host "`tError Count is: $(($files | Measure-Object).Count)" -ForegroundColor Red }  
        }


#Die mit Klammern abarbeiten
$files = gci -Path $searchpath -File -Filter "$($uname)(*.pdf"  
$filecount = ($files | Measure-Object).Count
if ($filecount -eq 2) {
        write-host "$uname () : "  
        Merge-PDF -InputFile $files.FullName, $files[1].FullName -OutputFile "$destinationdir\$uname(S2).pdf"  
        Write-Host "`t Merged" -ForegroundColor Green  
    } else {
        if ($filecount -ne 0){Write-Host "`tError Count is: $(($files | Measure-Object).Count)" -ForegroundColor Red }  
        }



}
147069
Lösung 147069 02.01.2021 aktualisiert um 11:12:12 Uhr
Goto Top
Ich würde das ganze ja direkt mit Group-Object machen, das spart einem bei so was einiges an manueller Arbeit face-wink
$searchpath = "c:\temp"  
$destinationdir = "c:\temp\neu"  

if (!(Get-Module -ListAvailable -Name PSWritePDF)) {
    Install-Module PSWritePDF -Force
}

ls $searchpath -Filter *.pdf -File | group {($_.Basename -split '[-\(]')[0]} | %{  
    if ($_.Count -gt 1){
        Merge-PDF -InputFile $_.Group.Fullname -Outputfile (join-path $destinationdir "$($_.Name).pdf")  
    }else{
        $_.Group | cp -Destination $destinationdir
    }
}

Gut's Neues 🎆 2021

p.s. Nur zur Info an den TO, das oben sind beides Powershell Skripte.
Batchanfaenger
Batchanfaenger 02.01.2021 um 22:40:49 Uhr
Goto Top
Vielen lieben Dank für die Bemühungen Seastorm und bluewonder,
aber warum auch immer klappen auch die beiden PowerShell-Skripte von Euch nicht so wie gewünscht, die Dateinamen kann ich leider nicht entsprechend glattziehen bzw. anpassen, weil das gleichzeitig die Nummern der dahinterliegenden Lieferscheine sind.

Seastorm bei deinem Skript kommt die Fehlermeldung - das er Begriff "else" nicht gedeutet werden kann:

else: The term 'else' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Write-Host "`t Merged" -ForegroundColor Green
} else {
if ($filecount -ne 0){Write-Host "`tError Count is: $(($files | Measure-Object).Count)" -ForegroundColor Red }
}
Gib tes noch eine andere Idee oder vieleicht doch ein Batch. Bei meiner Recherche habe ich mehrfach was bezgl. des Programms ptfk gelesen - geht es vielleicht damit ???
Danke im Voraus.
Batchanfaenger
147069
147069 02.01.2021 aktualisiert um 22:48:20 Uhr
Goto Top
aber warum auch immer klappen auch die beiden PowerShell-Skripte von Euch nicht so wie gewünscht
Mein Skript wurde hier einwandfrei getestet, funktioniert so wie von dir beschrieben. Wenn bei dir nicht machst du wohl bei dir einen Fehler, ist eher wahrscheinlich bei einem Anfänger der du ja zu sein scheinst.
Batchanfaenger
Batchanfaenger 02.01.2021 um 23:05:49 Uhr
Goto Top
Hallo bluewonder,
mit deiner Annahme liegst Du bestimmt richtig, sonst hätte ich diese Frage ja hier nicht an die Community gestellt - vielleicht kannst Du mir ja als Profi noch ein wenig dabei weiterhelfen und mir sagen wo denn mein Fehler liegen könnte. Ich habe dein Skipt mit der Powershell gestartet und auch die temp- Datei auf H angesprochen, da wie gesagt die Daten bei mir in einem Ordner unter Laufwerk H: liegen. Aber egal was ich mache - bei mir ändert sich an den Dateien im entsprechenden Ordner leider gar nichts! Sehr schade, denn ich hatte mir auch von Deiner Idee sehr viel versprochen.
Gruß
batchanfaenger
147069
147069 03.01.2021 aktualisiert um 11:11:00 Uhr
Goto Top
Zitat von @Batchanfaenger:

Aber egal was ich mache - bei mir ändert sich an den Dateien im entsprechenden Ordner leider gar nichts! Sehr schade, denn ich hatte mir auch von Deiner Idee sehr viel versprochen.
Gruß
batchanfaenger
Hast du wohl übersehen das die Dateien in einen separaten Ausgabe Ordner kopiert und nicht im Originalordner abgelegt werden 😉. Pfad in Zeile 2 anpassen und Ordner erstellen ...
Wenn das entsprechende Powershell Module (PSWritePDF) noch nicht installiert ist einmal das Skript elevated starten damit es installiert werden kann, dann lüppt dat auch.
Bebbie
Bebbie 13.09.2023 um 13:26:32 Uhr
Goto Top
Hallo,
ist zwar schon ein altes Thema. Ich habe ein vergleichbares Problem, schaffe aber nicht, den Code für mich passend anzupassen.
Er kopiert mir immer nur die PDF Dateien in den Zielordner.

Bei mir sollen Dateien im folgenden Format zusammengeführt werden:
Rechnung_123456.pdf
123456 Rechnungsanhang.pdf

123456 steht dann für die Rechnungsnummer.

Vielen Dank vorab für die Hilfe.
7907292512
7907292512 13.09.2023 aktualisiert um 13:41:29 Uhr
Goto Top
Bei mir sollen Dateien im folgenden Format zusammengeführt werden:
Rechnung_123456.pdf
123456 Rechnungsanhang.pdf
$searchpath = "c:\temp"    
$destinationdir = "c:\temp\neu"    

if (!(Get-Module -ListAvailable -Name PSWritePDF)) {
    Install-Module PSWritePDF -Force
}

ls $searchpath -Filter *.pdf -File | group {[regex]::match($_.Basename,'\d+').Value} | %{    
    if ($_.Count -gt 1){
        Merge-PDF -InputFile $_.Group.Fullname -Outputfile (join-path $destinationdir "$($_.Name).pdf")    
    }else{
        $_.Group | cp -Destination $destinationdir
    }
}
sid
Bebbie
Bebbie 14.09.2023 um 08:49:54 Uhr
Goto Top
Danke. Funktioniert fast. Die Reihenfolge ist jedoch falsch herum.
Mir wird im Code aber leider nicht klar, wo die Reihenfolge festgelegt ist.
Bei Powershell bin ich leider totaler Anfänger. Bisher habe ich nur VBA und SQL programmiert.
Ich möchte auch gerne nicht nur die fertige Lösung kopieren, sondern gerne auch verstehen, dass ich das auch mal für andere Fälle anpassen könnte. Eine kurze Erklärung wäre super.

Die Erste PDF soll Rechnung_123456.pdf sein und daran angefügt die 123456 Rechnungsanhang.pdf.
Zudem soll der Dateiname der zusammengefügten Datei identisch mit dem Dateinamen der 123456 Rechnungsanhang.pdf sein.
Wie ich den Dateinamen festlege, wird mir auch leider nicht klar.

Danke schon einmal.
7907292512
7907292512 14.09.2023 aktualisiert um 11:39:39 Uhr
Goto Top
Zitat von @Bebbie:

Danke. Funktioniert fast. Die Reihenfolge ist jedoch falsch herum.
Mir wird im Code aber leider nicht klar, wo die Reihenfolge festgelegt ist.
Bei Powershell bin ich leider totaler Anfänger. Bisher habe ich nur VBA und SQL programmiert.
Ich möchte auch gerne nicht nur die fertige Lösung kopieren, sondern gerne auch verstehen, dass ich das auch mal für andere Fälle anpassen könnte. Eine kurze Erklärung wäre super.

Die Erste PDF soll Rechnung_123456.pdf sein und daran angefügt die 123456 Rechnungsanhang.pdf.
Zudem soll der Dateiname der zusammengefügten Datei identisch mit dem Dateinamen der 123456 Rechnungsanhang.pdf sein.

Siehe Kommentare
$searchpath = "c:\temp"      
$destinationdir = "c:\temp\neu"      

# PSWritePDF Modul installieren wenn nicht vorhanden
if (!(Get-Module -ListAvailable -Name PSWritePDF)) {
    Install-Module PSWritePDF -Force
}
# Dateien anhand der Rechnungsnummer im Basename der Datei gruppieren
ls $searchpath -Filter *.pdf -File | group {[regex]::match($_.Basename,'\d+').Value} | %{      
    # wenn es mehr als eine Datei in der Gruppe gibt
    if ($_.Count -gt 1){
        # Dateien der Gruppe anhand ihres Namens absteigend sortieren
        $files = $_.Group | sort Name -Descending
        # Dateien zusammenfassen und als Zieldateiname den der zweiten Datei der Gruppe benutzen
        Merge-PDF -InputFile $files.Fullname -Outputfile (join-path $destinationdir "$($files[1].Name).pdf")  
    }else{
        # nur eine Datei in der Gruppe => verschiebe die Datei nur
        $_.Group | cp -Destination $destinationdir
    }
}

Für alles weitere
Powershell Leitfaden für Anfänger
Bebbie
Bebbie 14.09.2023 um 13:33:12 Uhr
Goto Top
Vielen Dank. Hat geklappt. Dann werde ich mir mal den Leitfaden anschauen.
Bebbie
Bebbie 15.09.2023 um 08:39:05 Uhr
Goto Top
Guten Morgen,

ich habe nun aus der Skriptdatei eine .exe (Test.exe) erstellt. Funktioniert auch soweit.
Ich möchte mir nun noch eine Messagebox einbauen, die mir signalisiert, wenn das Skript fertig gelaufen ist.
Das habe ich mit folgendem Code realisiert.

[System.Windows.Forms.MessageBox]::Show(„Die abgelegten Dokumente wurden zusammengeführt“,“Auftrag abgeschlossen“,0)

Nach abgeschlossenem Skript zeigt er mir dann die gewünschte Messagebox an. Nach Klick auf ok kommt dann aber noch eine Messagebox mit Titel "Test.exe", Text "OK" und Button "OK".
Warum, ist mir aber nicht klar.
Woran liegt das?
7907292512
7907292512 15.09.2023 aktualisiert um 08:53:10 Uhr
Goto Top
Kursive Anführungszeichen sind böse ...
Und ansonsten kennt keiner dein komplettes Skript.
Und bitte hier nicht Threads von anderen Leuten zu deinen eigenen Zwecken kapern!! Einfach mal die Diskussionsrichtlinien lesen ... Post gemeldet.