wolf6660
Goto Top

Wie eine PDF per Skript Passwort verschlüsseln

Hi,

ich habe folgendes Problem welches ich gerne automatisieren würde:

ich verschicke meinen Kunden jeden Monat Dokumente als PDF welche ich mit einem PW verschlüssle. Jeder Kunde hat ein eigenes PW. Zur Zeit erledige ich dies manuell mit PDF24. Dies ist aber sehr mühsam auch die internen Profile sind viel zu umständlich.

Suche eine Lösung um dies per One-Click zu machen z.B. als Batch oder so. Die Dateien haben immer den gleichen Namen.

Vielleicht hat jemand eine Lösung.

Danke

Content-ID: 670273

Url: https://administrator.de/forum/wie-eine-pdf-per-skript-passwort-verschluesseln-670273.html

Ausgedruckt am: 18.01.2025 um 19:01 Uhr

mbehrens
Lösung mbehrens 18.12.2024 um 19:30:49 Uhr
Goto Top
Zitat von @Wolf6660:

Suche eine Lösung um dies per One-Click zu machen z.B. als Batch oder so. Die Dateien haben immer den gleichen Namen.

Z. B. per pdftk:

pdftk <Quelldatei> output <Zieldatei> owner_pw <OwnerPW> user_pw <UserPW>
colinardo
Lösung colinardo 19.12.2024 aktualisiert um 13:30:04 Uhr
Goto Top
Servus.
Oder per Powershell und iText

<#
.Synopsis
   Verschlüsselung von PDF-Dokumenten
.DESCRIPTION
   Verschlüsselung von PDF-Dokumenten mit Passwörtern
.EXAMPLE
   .\protect-pdf.ps1 -path "E:\Quellordner\rechnung.pdf" -userpassword 'GeHeIm' -ownerpassword 'GeHeIm'  

   Versieht ein einzelnes PDF-Dokument mit User- und Besitzer-Passwort. Per Default wird ein neues Dokument mit dem suffix '_protected' im selben  
   Verzeichnis wie der Quelldatei erstellt.
.EXAMPLE
   .\protect-pdf.ps1 -path "E:\Quellordner\rechnung.pdf" -userpassword 'GeHeIm' -replaceOriginal  

   Versieht ein einzelnes PDF-Dokument nur User-Passwort und ersetzt die Originaldatei.
.EXAMPLE
   .\protect-pdf.ps1 -path "E:\Quellordner\rechnung.pdf" -userpassword 'GeHeIm' -suffix "_verschlüsselt" -force  

   Versieht ein einzelnes PDF-Dokument mit User-Passwort und hängt den suffix '_verschlüsselt' an den neuen Dateinamen an.  
   Bei Bedarf wird eine vorhandene Datei überschrieben (-force).
.EXAMPLE
   .\protect-pdf.ps1 -path "E:\Quellordner\rechnung.pdf" -userpassword 'GeHeIm' -permissions ALLOW_COPY,ALLOW_FILL_IN -encryptionCipher ENCRYPTION_AES_256  

   Versieht ein einzelnes PDF-Dokument mit User-Passwort und setzt diei Berechtigungen für das Kopieren von Inhalten und das Ausfüllen von Formularen
   und setzt die Verschlüsselung auf AES-256 (Kompatibel mit AdobeReader > 9.0)
.NOTES
   Wird kein Besitzerpasswort angegeben, wird ein zufälliges Passwort dafür verwendet.
#>
param(
    # Pfad
    [parameter(mandatory=$true)]
    [string[]]$path,
    
    # Benutzerpasswort
    [parameter(mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$userpassword,
    
    # Besitzerpasswort
    [parameter(mandatory=$false)]
    [ValidateNotNullOrEmpty()]
    [string]$ownerpassword,
    
    # suffix der an den Dateinamen angehängt wird
    [parameter(mandatory=$false)]
    [ValidateNotNullOrEmpty()]
    [string]$suffix = "_protected",  

    # Berechtigungen innerhalb der PDF-datei definieren
    [parameter(mandatory=$false)]
    [ValidateNotNullOrEmpty()]
    [ValidateSet('ALLOW_PRINTING','ALLOW_MODIFY_CONTENTS','ALLOW_COPY','ALLOW_MODIFY_ANNOTATIONS','ALLOW_FILL_IN','ALLOW_SCREENREADERS','ALLOW_ASSEMBLY','ALLOW_DEGRADED_PRINTING')]  
    [string[]]$permissions = ('ALLOW_PRINTING','ALLOW_SCREENREADERS','ALLOW_DEGRADED_PRINTING'),  

    # Verschlüsselungsstärke
    [parameter(mandatory=$false)]
    [ValidateSet('ENCRYPTION_AES_128','ENCRYPTION_AES_256')]  
    [string]$encryptionCipher = 'ENCRYPTION_AES_128',  

    # Metadaten verschlüsseln
    [parameter(mandatory=$false)]
    [bool]$encryptMetadata = $true,
    
    # Originaldatei ersetzen
    [parameter(mandatory=$false)]
    [switch]$replaceOriginal,
    
    # vorhandene Dateien überschreiben
    [parameter(mandatory=$false)]
    [switch]$force
)

$ErrorActionPreference = 'Stop'  
$upass = [System.Text.Encoding]::UTF8.GetBytes($userpassword)
if ($ownerpassword -ne $null){
    $opass = [System.Text.Encoding]::UTF8.GetBytes($ownerpassword)
}else{
    $opass = $null
}
# Berechtigungen ermitteln
$permission_bits = 0
$permissions | %{$permission_bits = $permission_bits -bor [iTextSharp.text.pdf.PdfWriter]::$_}

# Verschlüsselungs-Einstellungen ermitteln
$encryption_bits = [iTextSharp.text.pdf.PdfWriter]::$encryptionCipher
if (!$encryptMetadata){
    $encryption_bits = $encryption_bits -bor [iTextSharp.text.pdf.PdfWriter]::DO_NOT_ENCRYPT_METADATA
}

# 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)){
            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)
            }
            write-host "OK" -F Green   
        }
        if (Get-Item $localpath -Stream zone.identifier -ea SilentlyContinue){
            Unblock-File -Path $localpath
        }
        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

# auch geschütze PDFs öffnen aktivieren
[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true

# Alle angegebenen PDF-Dateien verarbeiten
foreach($file in Get-ChildItem -Path $path -File -Filter *.pdf) {
    $reader = $null;$stamper = $null
    try {
        # PDF Reader Object erstellen
        $reader = New-Object iTextSharp.text.pdf.PdfReader $file.Fullname
        # Orginal ersetzen oder string anhängen
        if ($replaceOriginal.IsPresent){
            $newfile = join-path $env:TEMP ([io.path]::GetRandomFileName())
            write-host "Encrypting '$($file.Fullname)' ..." -F Green  
        }else{
            # Ausgabepfad erstellen
            $newfile = Join-Path $file.DirectoryName "$($file.Basename)$suffix.pdf"  
            # Error wenn Datei bereits existiert
            if ((Test-Path $newfile -PathType Leaf) -and !$force.IsPresent){
                throw "File '$newfile' already exists."  
            }
            write-host "Encrypting '$($file.Fullname)' to '$newfile' ..." -F Green  
        }
        # PDF-Stamper erstellen
        $stamper = [iTextSharp.text.pdf.PdfStamper]::new($reader,[System.IO.FileStream]::new($newfile,[System.IO.FileMode]::Create))
        # Verschlüsselung setzen
        $stamper.SetEncryption($upass,$opass,$permission_bits,$encryption_bits)
        # cleanup
        $stamper.Close();$reader.Close()
        $stamper.Dispose();$reader.Dispose()
        # Originaldatei mit verschüsselter Datei ersetzen
        if ($replaceOriginal.IsPresent){
            remove-item -LiteralPath $file.Fullname -Force
            move-item -LiteralPath $newfile -Destination $file.Fullname
        }
    }catch{
        write-host $_.Exception.Message -F Red
    }finally{
        if($reader){$reader.Dispose()}
        if($stamper){$stamper.Dispose()}
    }
}

Beispiel-Anwendung aus der Powershell-Konsole

.\protect-pdf.ps1 -path "E:\Quellordner\rechnung.pdf" -userpassword 'GeHeIm' -ownerpassword 'GeHeIm'  
ode aus der CMD heraus
powershell -EP Bypass -File "C:\Pfad\zum\Script\protect-pdf.ps1" -path "E:\Quellordner\rechnung.pdf" -userpassword 'GeHeIm' -ownerpassword 'GeHeIm'  

Weitere Beispiele, z.B. für das Setzen von Berechtigungen finden sich in der Synopsis

Grüße Uwe
Wolf6660
Wolf6660 19.12.2024 um 13:06:40 Uhr
Goto Top
Danke super klappt perfekt
Wolf6660
Wolf6660 19.12.2024 um 13:07:55 Uhr
Goto Top
Zitat von @colinardo:

Servus.
Oder per Powershell und iText

Danke für deine Antwort - habe aber die Lösung von mbehrens umgesetzt.