Verschlüsselung und Sicherheit
PDF Oxide unterstützt die Verschlüsselung von PDFs mit Passwörtern und Berechtigungen nach Industriestandard. Sie können ein Benutzerpasswort (zum Öffnen des Dokuments erforderlich), ein Eigentümerpasswort (für vollständigen Zugriff erforderlich) sowie granulare Berechtigungen für Drucken, Kopieren und Ändern festlegen.
Binding-Abdeckung. Das Öffnen verschlüsselter PDFs funktioniert in allen Bindings (
password=in Python,PdfDocument.open_with_passwordin Rust,authenticate()in WASM,AuthenticateamPdfDocumentin Go/C#,OpenWithPasswordin C#). Die Erzeugung verschlüsselter Ausgaben (save_encrypted/saveEncryptedToBytes) steht in Python, Rust, WASM und Go (DocumentEditor.SaveEncrypted) zur Verfügung. Der C#-DocumentEditorstelltSaveEncryptedderzeit nicht bereit — nutzen Sie das Rust-CLI (pdf-oxide encrypt) oder einen Go/Python-Schritt, um verschlüsselte Ausgaben in C#-Workflows zu erzeugen.
Algorithmus-Unterstützung
| Algorithmus | Lesen | Schreiben | Hinweise |
|---|---|---|---|
| RC4 (40/128 Bit) | Ja | Ja | Veraltet; nur für Kompatibilität verwenden |
| AES-128 (V=4, R=4) | Ja | Ja | Standard für PDF 1.6+ |
| AES-256 (V=5, R=6) | Ja | Ja | PDF 2.0; umfasst Entschlüsselung von Strings in unkomprimierten Objekten, /MK /CA-Beschriftungen von Button-Widgets und korrekte Algorithm-2.B-Terminierung |
AES-256 wird vollständig End-to-End unterstützt: Öffnen, Authentifizieren, Formulardaten lesen und verschlüsselte Ausgaben speichern. ObjStm- und XRef-Streams werden gemäß ISO 32000-2 §7.6.3 nicht verschlüsselt. Der Objektcache wird nach einem verzögerten authenticate()-Aufruf korrekt ungültig gemacht, sodass vor der Authentifizierung gelesene Inhalte mit dem richtigen Schlüssel neu geparst werden.
Schnellstart: Mit Verschlüsselung speichern
Python
from pdf_oxide import PdfDocument
doc = PdfDocument("input.pdf")
doc.set_title("Confidential Report")
# Encrypt with user and owner passwords
doc.save_encrypted("protected.pdf", "user123", "owner456")
WASM
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
doc.setTitle("Confidential Report");
// Encrypt with user and owner passwords (all permissions enabled)
const output = doc.saveEncryptedToBytes(
"user123", "owner456", true, true, true, true
);
doc.free();
Rust
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("input.pdf")?;
// Simple encryption with user and owner passwords
doc.save_encrypted("protected.pdf", "user123", "owner456")?;
Go
package main
import (
"log"
pdfoxide "github.com/yfedoseev/pdf_oxide/go"
)
func main() {
editor, err := pdfoxide.OpenEditor("input.pdf")
if err != nil { log.Fatal(err) }
defer editor.Close()
_ = editor.SetTitle("Confidential Report")
// Encrypt with user and owner passwords (AES-256)
if err := editor.SaveEncrypted("protected.pdf", "user123", "owner456"); err != nil {
log.Fatal(err)
}
}
C++
#include <pdf_oxide/pdf_oxide.hpp>
auto editor = pdf_oxide::DocumentEditor::open("input.pdf");
// Encrypt with user and owner passwords (AES-256)
editor.save_encrypted("protected.pdf", "user123", "owner456");
Swift
import PdfOxide
let editor = try DocumentEditor.openEditor("input.pdf")
// Encrypt with user and owner passwords (AES-256)
try editor.saveEncrypted("protected.pdf", userPassword: "user123", ownerPassword: "owner456")
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
final editor = DocumentEditor.open('input.pdf');
// Encrypt with user and owner passwords (AES-256)
editor.saveEncrypted('protected.pdf', 'user123', 'owner456');
editor.close();
R
library(pdfoxide)
editor <- pdf_editor_open("input.pdf")
# Encrypt with user and owner passwords (AES-256)
pdf_editor_save_encrypted(editor, "protected.pdf", "user123", "owner456")
Julia
using PdfOxide
editor = open_editor("input.pdf")
# Encrypt with user and owner passwords (AES-256)
save_encrypted(editor, "protected.pdf", "user123", "owner456")
Zig
const pdf_oxide = @import("pdf_oxide");
var editor = try pdf_oxide.DocumentEditor.openEditor("input.pdf");
defer editor.deinit();
// Encrypt with user and owner passwords (AES-256)
try editor.saveEncrypted("protected.pdf", "user123", "owner456");
Objective-C
#import "POXPdfOxide.h"
NSError *err = nil;
POXDocumentEditor *editor = [POXDocumentEditor openEditor:@"input.pdf" error:&err];
// Encrypt with user and owner passwords (AES-256)
[editor saveEncryptedToPath:@"protected.pdf"
userPassword:@"user123"
ownerPassword:@"owner456"
error:&err];
Elixir
{:ok, editor} = PdfOxide.open_editor("input.pdf")
# Encrypt with user and owner passwords (AES-256)
:ok = PdfOxide.editor_save_encrypted(editor, "protected.pdf", "user123", "owner456")
Verschlüsselung mit benutzerdefinierten Berechtigungen
Python
Die Methode save_encrypted akzeptiert Berechtigungs-Flags als Schlüsselwortargumente.
from pdf_oxide import PdfDocument
doc = PdfDocument("input.pdf")
# View-only: no printing, copying, or modifying
doc.save_encrypted(
"readonly.pdf",
"viewpass",
"adminpass",
allow_print=False,
allow_copy=False,
allow_modify=False,
allow_annotate=False,
)
# Allow only printing
doc.save_encrypted(
"print-only.pdf",
"", # No open password required
"adminpass",
allow_print=True,
allow_copy=False,
allow_modify=False,
allow_annotate=False,
)
Python-Parameter für save_encrypted
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
path |
str |
erforderlich | Pfad der Ausgabedatei |
user_password |
str |
erforderlich | Öffnungspasswort (leer = kein Passwort) |
owner_password |
str |
None |
Vollzugriffspasswort (Standard: wie Benutzerpasswort) |
allow_print |
bool |
True |
Drucken erlauben |
allow_copy |
bool |
True |
Kopieren von Text/Grafiken erlauben |
allow_modify |
bool |
True |
Dokument ändern erlauben |
allow_annotate |
bool |
True |
Anmerkungen hinzufügen erlauben |
WASM
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
// View-only: no printing, copying, or modifying
const readonly = doc.saveEncryptedToBytes(
"viewpass", "adminpass", false, false, false, false
);
// Allow only printing (empty user password = no open password)
const printOnly = doc.saveEncryptedToBytes(
"", "adminpass", true, false, false, false
);
doc.free();
Rust
Für vollständige Kontrolle über die Verschlüsselungseinstellungen verwenden Sie EncryptionConfig und SaveOptions.
use pdf_oxide::api::Pdf;
use pdf_oxide::editor::{
EncryptionConfig, EncryptionAlgorithm, Permissions, SaveOptions,
};
let mut doc = Pdf::open("input.pdf")?;
// Build permissions
let mut perms = Permissions::read_only();
perms.print = true; // Allow printing only
// Build encryption config
let config = EncryptionConfig::new("user123", "owner456")
.with_algorithm(EncryptionAlgorithm::Aes256)
.with_permissions(perms);
// Save with encryption
doc.save_with_encryption("protected.pdf", config)?;
EncryptionConfig
Das Struct EncryptionConfig steuert alle Verschlüsselungsparameter.
use pdf_oxide::editor::{EncryptionConfig, EncryptionAlgorithm, Permissions};
let config = EncryptionConfig {
user_password: "user123".to_string(),
owner_password: "owner456".to_string(),
algorithm: EncryptionAlgorithm::Aes256,
permissions: Permissions::all(),
};
Oder mit dem Builder-Muster:
let config = EncryptionConfig::new("user123", "owner456")
.with_algorithm(EncryptionAlgorithm::Aes128)
.with_permissions(Permissions::read_only());
Felder von EncryptionConfig
| Feld | Typ | Beschreibung |
|---|---|---|
user_password |
String |
Passwort zum Öffnen des Dokuments |
owner_password |
String |
Passwort für vollständigen Zugriff und Sicherheitsänderungen |
algorithm |
EncryptionAlgorithm |
Zu verwendender Verschlüsselungsalgorithmus |
permissions |
Permissions |
Zugriffskontroll-Flags |
Verschlüsselungsalgorithmen
| Algorithmus | Beschreibung |
|---|---|
EncryptionAlgorithm::Aes256 |
AES-256 (stärkste, empfohlen) |
EncryptionAlgorithm::Aes128 |
AES-128 |
EncryptionAlgorithm::Rc4_128 |
RC4 128 Bit (Kompatibilität mit Legacy-Systemen) |
EncryptionAlgorithm::Rc4_40 |
RC4 40 Bit (veraltet, schwach) |
AES-256 ist der Standard bei Verwendung von save_encrypted() in Python oder der Pdf-API.
Berechtigungen (Permissions)
Das Struct Permissions steuert, welche Operationen erlaubt sind, wenn das Dokument mit dem Benutzerpasswort geöffnet wird.
use pdf_oxide::editor::Permissions;
// Allow everything
let all = Permissions::all();
// Restrict everything
let readonly = Permissions::read_only();
Felder von Permissions
| Feld | Typ | Standard (all) | Standard (read_only) | Beschreibung |
|---|---|---|---|---|
print |
bool |
true |
false |
Drucken erlauben |
print_high_quality |
bool |
true |
false |
Hochqualitätsdruck erlauben |
modify |
bool |
true |
false |
Inhalte ändern erlauben |
copy |
bool |
true |
false |
Text/Grafiken kopieren erlauben |
annotate |
bool |
true |
false |
Anmerkungen hinzufügen erlauben |
fill_forms |
bool |
true |
false |
Formularfelder ausfüllen erlauben |
accessibility |
bool |
true |
true |
Barrierefreiheits-Extraktion erlauben |
assemble |
bool |
true |
false |
Seitenzusammenstellung erlauben |
Benutzerdefinierte Berechtigungen
let mut perms = Permissions::read_only();
perms.print = true; // Allow printing
perms.fill_forms = true; // Allow filling forms
perms.accessibility = true; // Always allow for compliance
SaveOptions
Verwenden Sie SaveOptions für vollständige Kontrolle über das Schreiben des Dokuments.
use pdf_oxide::editor::{SaveOptions, EncryptionConfig};
// Full rewrite (default)
let opts = SaveOptions::full_rewrite();
// Incremental update (faster, preserves structure)
let opts = SaveOptions::incremental();
// With encryption
let config = EncryptionConfig::new("user", "owner");
let opts = SaveOptions::with_encryption(config);
Verschlüsselte PDFs öffnen
Python
Übergeben Sie das Passwort beim Öffnen des Dokuments.
from pdf_oxide import PdfDocument
doc = PdfDocument("protected.pdf", password="user123")
text = doc.extract_text(0)
print(text)
Rust
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open_with_password("protected.pdf", "user123")?;
let text = doc.extract_text(0)?;
println!("{}", text);
Go
doc, _ := pdfoxide.Open("protected.pdf")
defer doc.Close()
if _, err := doc.Authenticate("user123"); err != nil { log.Fatal(err) }
text, _ := doc.ExtractText(0)
fmt.Println(text)
C#
using var doc = PdfDocument.OpenWithPassword("protected.pdf", "user123");
Console.WriteLine(doc.ExtractText(0));
C++
#include <pdf_oxide/pdf_oxide.hpp>
#include <iostream>
auto doc = pdf_oxide::Document::open_with_password("protected.pdf", "user123");
std::cout << doc.extract_text(0) << std::endl;
Swift
import PdfOxide
let doc = try Document.openWithPassword("protected.pdf", password: "user123")
print(try doc.extractText(0))
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
final doc = PdfDocument.openWithPassword('protected.pdf', 'user123');
print(doc.extractText(0));
doc.close();
R
library(pdfoxide)
doc <- pdf_open_with_password("protected.pdf", "user123")
cat(pdf_extract_text(doc, 0))
Julia
using PdfOxide
doc = open_with_password("protected.pdf", "user123")
println(extract_text(doc, 0))
Zig
const std = @import("std");
const pdf_oxide = @import("pdf_oxide");
const a = std.heap.page_allocator;
var doc = try pdf_oxide.Document.openWithPassword("protected.pdf", "user123");
defer doc.deinit();
const text = try doc.extractText(a, 0);
std.debug.print("{s}\n", .{text});
Objective-C
#import "POXPdfOxide.h"
NSError *err = nil;
POXDocument *doc = [POXDocument openWithPassword:@"protected.pdf" password:@"user123" error:&err];
NSLog(@"%@", [doc extractText:0 error:&err]);
Elixir
{:ok, doc} = PdfOxide.open_with_password("protected.pdf", "user123")
{:ok, text} = PdfOxide.extract_text(doc, 0)
IO.puts(text)
Vollständiger Verschlüsselungs-Workflow
Python
from pdf_oxide import PdfDocument
# Open and modify
doc = PdfDocument("report.pdf")
doc.set_title("Confidential Report")
doc.set_author("Finance Team")
# Save with view-only restrictions
doc.save_encrypted(
"report-protected.pdf",
"", # No password to open
"admin2025", # Owner password for full access
allow_print=True,
allow_copy=False,
allow_modify=False,
)
WASM
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
doc.setTitle("Confidential Report");
doc.setAuthor("Finance Team");
// Save with view-only restrictions (no open password, print allowed)
const output = doc.saveEncryptedToBytes(
"", "admin2025", true, false, false, false
);
doc.free();
Rust
use pdf_oxide::api::Pdf;
use pdf_oxide::editor::{
DocumentEditor, EditableDocument,
EncryptionConfig, EncryptionAlgorithm, Permissions, SaveOptions,
};
// Open and modify
let mut doc = Pdf::open("report.pdf")?;
{
let editor = doc.editor().unwrap();
editor.set_title("Confidential Report");
editor.set_author("Finance Team");
}
// Configure encryption
let permissions = Permissions {
print: true,
print_high_quality: true,
modify: false,
copy: false,
annotate: false,
fill_forms: true,
accessibility: true,
assemble: false,
};
let config = EncryptionConfig::new("", "admin2025")
.with_algorithm(EncryptionAlgorithm::Aes256)
.with_permissions(permissions);
doc.save_with_encryption("report-protected.pdf", config)?;
Die vollflächigen Bindings unten speichern die Ausgabe mit AES-256 und vollen Berechtigungen; sie stellen die per-Flag-Berechtigungssteuerung aus Python/WASM/Rust nicht bereit. Setzen Sie
/Info-Metadaten überset_producerdes Editors vor dem Speichern.
C++
#include <pdf_oxide/pdf_oxide.hpp>
auto editor = pdf_oxide::DocumentEditor::open("report.pdf");
editor.set_producer("Finance Team");
// Save with AES-256 encryption (no open password, owner password for full access)
editor.save_encrypted("report-protected.pdf", "", "admin2025");
Swift
import PdfOxide
let editor = try DocumentEditor.openEditor("report.pdf")
try editor.setProducer("Finance Team")
// Save with AES-256 encryption (no open password, owner password for full access)
try editor.saveEncrypted("report-protected.pdf", userPassword: "", ownerPassword: "admin2025")
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
final editor = DocumentEditor.open('report.pdf');
editor.setProducer('Finance Team');
// Save with AES-256 encryption (no open password, owner password for full access)
editor.saveEncrypted('report-protected.pdf', '', 'admin2025');
editor.close();
R
library(pdfoxide)
editor <- pdf_editor_open("report.pdf")
pdf_editor_set_producer(editor, "Finance Team")
# Save with AES-256 encryption (no open password, owner password for full access)
pdf_editor_save_encrypted(editor, "report-protected.pdf", "", "admin2025")
Julia
using PdfOxide
editor = open_editor("report.pdf")
set_producer(editor, "Finance Team")
# Save with AES-256 encryption (no open password, owner password for full access)
save_encrypted(editor, "report-protected.pdf", "", "admin2025")
Zig
const pdf_oxide = @import("pdf_oxide");
var editor = try pdf_oxide.DocumentEditor.openEditor("report.pdf");
defer editor.deinit();
try editor.setProducer("Finance Team");
// Save with AES-256 encryption (no open password, owner password for full access)
try editor.saveEncrypted("report-protected.pdf", "", "admin2025");
Objective-C
#import "POXPdfOxide.h"
NSError *err = nil;
POXDocumentEditor *editor = [POXDocumentEditor openEditor:@"report.pdf" error:&err];
[editor setProducer:@"Finance Team" error:&err];
// Save with AES-256 encryption (no open password, owner password for full access)
[editor saveEncryptedToPath:@"report-protected.pdf"
userPassword:@""
ownerPassword:@"admin2025"
error:&err];
Elixir
{:ok, editor} = PdfOxide.open_editor("report.pdf")
:ok = PdfOxide.set_producer(editor, "Finance Team")
# Save with AES-256 encryption (no open password, owner password for full access)
:ok = PdfOxide.editor_save_encrypted(editor, "report-protected.pdf", "", "admin2025")
Mit anderen Einstellungen neu verschlüsseln
Rust
use pdf_oxide::editor::{DocumentEditor, EditableDocument, EncryptionConfig, SaveOptions};
// Open with current password
let mut editor = DocumentEditor::open("old-protected.pdf")?;
// Save with new encryption
let config = EncryptionConfig::new("newuser", "newowner");
let options = SaveOptions::with_encryption(config);
editor.save_with_options("re-encrypted.pdf", options)?;
Vollständige API-Referenz
Methoden von Pdf
| Methode | Rückgabe | Beschreibung |
|---|---|---|
save_encrypted(path, user_pw, owner_pw) |
Result<()> |
Mit AES-256 und vollen Berechtigungen speichern |
save_with_encryption(path, config) |
Result<()> |
Mit benutzerdefinierter Verschlüsselungskonfiguration speichern |
Methoden von DocumentEditor / EditableDocument
| Methode | Rückgabe | Beschreibung |
|---|---|---|
save(path) |
Result<()> |
Mit vollständigem Neuschreiben speichern (keine Verschlüsselung) |
save_with_options(path, options) |
Result<()> |
Mit benutzerdefinierten Optionen speichern |
Konfigurationstypen
| Typ | Beschreibung |
|---|---|
EncryptionConfig |
Benutzer-/Eigentümerpasswörter, Algorithmus, Berechtigungen |
EncryptionAlgorithm |
Aes256, Aes128, Rc4_128, Rc4_40 |
Permissions |
Detaillierte Zugriffskontroll-Flags |
SaveOptions |
Vollständiges Neuschreiben, inkrementelles Update oder verschlüsseltes Speichern |
Verwandte Seiten
- Bearbeitungsübersicht – Öffnen, Metadaten und Speicher-Workflow
- Formularfeld-Bearbeitung – Formularbearbeitung mit Berechtigungen einschränken
- Schwärzung (Redaction) – Inhalte vor der Verschlüsselung schwärzen
- Seitenoperationen – Seiten vor der finalen Verschlüsselung vorbereiten