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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
4 Kommentare
Neuester Kommentar
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>
Servus.
Oder per Powershell und iText
Beispiel-Anwendung aus der Powershell-Konsole
ode aus der CMD heraus
Weitere Beispiele, z.B. für das Setzen von Berechtigungen finden sich in der Synopsis
Grüße Uwe
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'
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