baraban
Goto Top

Powershell - PDF 1. Seite löschen

Hi zusammen,

ich benötige Hilfe bei folgender Problemstellung für Powershell:

In einem Ordner müssen bei allen PDF Dateien die erste Seite gelöscht werden.

Hintergrund ist folgender: Bei der ersten Seite handelt es sich um ein Versandblatt und muss entfernt werden.

Wäre super, wenn mir jemand auf die Sprünge helfen könnte.

Vielen Dank und beste Grüße
Baraban

Content-ID: 1899018742

Url: https://administrator.de/contentid/1899018742

Ausgedruckt am: 19.11.2024 um 19:11 Uhr

colinardo
Lösung colinardo 12.02.2022 aktualisiert um 17:34:24 Uhr
Goto Top
Servus.

Variante iTextSharp:
# ------------------------------------------------------
# Pfad in dem die PDFs liegen
$pdfquelle = "D:\quelle"  
# Ausgabeorder (hier werden die modfizierten Dateien abgelegt)
$pdfziel = "D:\ziel"  
# ------------------------------------------------------
# Ausgabeordner erstellen falls er nicht existiert
if (!(Test-Path $pdfziel)){md $pdfziel -Force | out-null}

# Mindestens PS 3.0 erforderlich
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    

# Funktion zum Laden des iTextSharp Assemblies
function Load-iTextLibrary {
    if($psscriptroot -ne ''){  
        $localpath = join-path $psscriptroot 'itextsharp.dll'  
    }else{
        $localpath = join-path $env:TEMP 'itextsharp.dll'  
    }
    $zip = $null;$tmp = ''  
    try{
        if(!(Test-Path $localpath)){
            # Accept all TLS protocols
            [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::GetNames([System.Net.SecurityProtocolType]) 
            Add-Type -A System.IO.Compression.FileSystem
            $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"  
            write-host "Downloading and extracting required 'iTextSharp.dll' ... " -F Green -NoNewline  

            (New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/iTextSharp/5.5.13.1', $tmp)  
            $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
            $zip.Entries | ?{$_.Fullname -eq 'lib/itextsharp.dll'} | %{  
                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
            }
            Unblock-File -Path $localpath
            write-host "OK" -F Green   
        }
        Add-Type -Path $localpath
    }catch{
        throw "Error: $($_.Exception.Message)"  
    }finally{
        if ($zip){$zip.Dispose()}
        if ($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}  
    }
}
# iText Library laden
Load-iTextLibrary

[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true

# Alle PDF-Dateien des Ordners rekursiv verarbeiten
foreach ($file in Get-ChildItem $pdfquelle -Filter *.pdf -File -recurse){
    write-host "Verarbeite Datei '$($file.Fullname)' ..." -F Green -NoNewline  
    # Ziel festlegen
    $targetpath = $file.DirectoryName -replace [regex]::escape($pdfquelle),$pdfziel
    if (!(Test-Path $targetpath)){md $targetpath -Force | out-null}
    $targetfile = join-path $targetpath $file.Name
    try{
        # PDF Reader Object erstellen
        $reader = new-object iTextSharp.text.pdf.PdfReader $file.Fullname
        
        # document objekt erstellen
        $doc = [iTextSharp.text.Document]::new()
        # Kopie des PDFs im Ausgabeordner erstellen
        $copy = [iTextSharp.text.pdf.PdfCopy]::new($doc,([System.IO.FileStream]::new($targetfile,[System.IO.FileMode]::Create,[System.IO.FileAccess]::Write)))
        # Dokument für die Bearbeitung öffen
        $doc.Open()
        # alle Seiten bis auf die erste in Kopie übertragen
        2..($reader.NumberOfPages) | %{
            # Seite der Kopie hinzufügen
            $copy.AddPage($copy.GetImportedPage($reader,$_))
        }
        # Handles zu den Objekten schließen
        $copy.Close()
        $copy.Dispose()
        $doc.Close()
        $doc.Dispose()
        $reader.Close()
        $reader.Dispose()
        write-host "OK." -F Green  
    }catch{
        # Error zeige Fehler
        write-host $_.Exception.Message -F Red
    }
}

Variante PDFtk / Download der pdftk.exe hier: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

$pdftk = "D:\pdftk\pdftk.exe"  
$quelle = "D:\quelle"  
$ziel = "D:\ziel"  
if(!(Test-Path $ziel)){md $ziel -Force | out-null}
foreach($file in Get-ChildItem $quelle -File -Filter *.pdf ){
    &$pdftk "`"$($file.Fullname)`"" "cat" "2-end" "output" "`"$ziel\$($file.Name)`""  
}
Grüße Uwe
Baraban
Baraban 12.02.2022 um 18:11:51 Uhr
Goto Top
Hi Uwe,

iTextSharp funktioniert einwandfrei. Ich danke dir vielmals.

PDFtk kriege ich nicht zum laufen, weil ich zu dumm bin vermutlich.

Schönes Wochenende!
OKIDOKI
OKIDOKI 13.02.2022 aktualisiert um 08:36:21 Uhr
Goto Top
Hi Baraban,
in diesem Forum habe ich bereits Mega-Hilfe erhalten und schaue, ob ich irgendwann auch mal etwas zurückgeben kann ... face-smile was hier natürlich gar nicht einfach ist!

Ich hatte ähnliche Probleme mit pdf's und bin nach sehr langer Suche auf eines, wie ich finde, richtig gutes Tool gestoßen: cmd, free, little, umfangreich ...

Damit könntest du dein Problem sogar in einem Einzeiler lösen, wie auch bei Uwe (nur noch in die Schleife bauen):
cpdf in.pdf 2-end -o out.pdf

Hier findest du weitere Infos, wobei dir nach dem Download ein super Manual bereitgestellt wird. Soll heißen, auch ich als Dummy kam damit sehr schnell zurecht face-smile
cpdf

Good luck!

Grüße
okidoki