Skip to content

Шифрування та дешифрування PDF — Python / Rust / Go

Покриття біндингів. Дешифрування (відкриття файлу з паролем) підтримується в усіх п’ятьох біндингах. Збереження нового зашифрованого PDF доступне у Python, Rust, Go (DocumentEditor.SaveEncrypted) та WASM (saveEncryptedToBytes). Публічний C#-API відкриває захищені паролем документи через PdfDocument.OpenWithPassword, але публічної обгортки SaveEncrypted ще немає — якщо треба генерувати зашифрований вивід із C#-пайплайну, використовуйте Rust CLI або біндинги Go/Python.

Зашифруйте PDF паролем:

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
doc.save_encrypted("protected.pdf", "userpass", "ownerpass")

WASM

import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
const encrypted = doc.saveEncryptedToBytes("userpass", "ownerpass", true, true, true, true);
// encrypted — це Uint8Array
doc.free();

Rust

use pdf_oxide::api::Pdf;

let mut doc = Pdf::open("report.pdf")?;
doc.save_encrypted("protected.pdf", "userpass", "ownerpass")?;

Go

package main

import (
    "log"
    pdfoxide "github.com/yfedoseev/pdf_oxide/go"
)

func main() {
    editor, err := pdfoxide.OpenEditor("report.pdf")
    if err != nil { log.Fatal(err) }
    defer editor.Close()

    if err := editor.SaveEncrypted("protected.pdf", "userpass", "ownerpass"); err != nil {
        log.Fatal(err)
    }
}

Відкрийте зашифрований PDF:

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("protected.pdf", password="userpass")
text = doc.extract_text(0)
print(text)

WASM

const doc = new WasmPdfDocument(encryptedBytes);
doc.authenticate("userpass");
const text = doc.extractText(0);
console.log(text);
doc.free();

Rust

let mut doc = Pdf::open_with_password("protected.pdf", "userpass")?;
let text = doc.extract_text(0)?;
println!("{}", text);

Go

doc, _ := pdfoxide.Open("protected.pdf")
defer doc.Close()

if _, err := doc.Authenticate("userpass"); err != nil { log.Fatal(err) }
text, _ := doc.ExtractText(0)
fmt.Println(text)

C#

using PdfOxide;

using var doc = PdfDocument.OpenWithPassword("protected.pdf", "userpass");
Console.WriteLine(doc.ExtractText(0));

PDF Oxide за замовчуванням використовує шифрування AES-256. Ліцензія MIT, без обмежень AGPL.

Встановлення

pip install pdf_oxide

Шифрування PDF

Базове шифрування

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("input.pdf")
doc.save_encrypted("output.pdf", "user123", "owner456")

WASM

const doc = new WasmPdfDocument(bytes);
const encrypted = doc.saveEncryptedToBytes("user123", "owner456", true, true, true, true);
doc.free();

Rust

let mut doc = Pdf::open("input.pdf")?;
doc.save_encrypted("output.pdf", "user123", "owner456")?;
  • Пароль користувача — потрібен, щоб відкрити та переглядати документ
  • Пароль власника — потрібен для повного доступу (друк, копіювання, редагування)

Лише пароль на відкриття

Задайте пароль користувача без обмежень:

doc = PdfDocument("input.pdf")
doc.save_encrypted("locked.pdf", "viewpass", "adminpass")

Без пароля на відкриття, але з обмеженнями

Дозвольте будь-кому переглядати документ, але заборонити друк і копіювання:

Python

doc = PdfDocument("input.pdf")
doc.save_encrypted(
    "restricted.pdf",
    "",            # Без пароля на відкриття
    "adminpass",   # Пароль власника для повного доступу
    allow_print=False,
    allow_copy=False,
    allow_modify=False,
    allow_annotate=False,
)

WASM

const doc = new WasmPdfDocument(bytes);
const restricted = doc.saveEncryptedToBytes(
    "",           // Без пароля на відкриття
    "adminpass",  // Пароль власника для повного доступу
    false,        // allowPrint
    false,        // allowCopy
    false,        // allowModify
    false         // allowAnnotate
);
doc.free();

Rust

let config = EncryptionConfig::new("", "adminpass")
    .with_permissions(Permissions::none());
doc.save_with_encryption("restricted.pdf", config)?;

Лише друк

Дозвольте перегляд і друк, але заборонити копіювання та редагування:

Python

doc = PdfDocument("input.pdf")
doc.save_encrypted(
    "print-only.pdf",
    "",
    "adminpass",
    allow_print=True,
    allow_copy=False,
    allow_modify=False,
)

WASM

const doc = new WasmPdfDocument(bytes);
const printOnly = doc.saveEncryptedToBytes(
    "",           // Без пароля на відкриття
    "adminpass",
    true,         // allowPrint
    false,        // allowCopy
    false,        // allowModify
    true          // allowAnnotate
);
doc.free();

Rust

let config = EncryptionConfig::new("", "adminpass")
    .with_permissions(Permissions::print_only());
doc.save_with_encryption("print-only.pdf", config)?;

Варіанти прав доступу

Параметр Типове значення Опис
allow_print True Дозволити друк документа
allow_copy True Дозволити копіювання тексту й графіки
allow_modify True Дозволити зміну вмісту
allow_annotate True Дозволити додавання анотацій

Дешифрування PDF

Відкриття з паролем

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("encrypted.pdf", password="secret")
text = doc.extract_text(0)
print(f"Pages: {doc.page_count()}")

WASM

const doc = new WasmPdfDocument(encryptedBytes);
doc.authenticate("secret");
const text = doc.extractText(0);
console.log(`Pages: ${doc.pageCount()}`);
doc.free();

Rust

let mut doc = Pdf::open_with_password("encrypted.pdf", "secret")?;
let text = doc.extract_text(0)?;
println!("Pages: {}", doc.page_count()?);

Збереження без шифрування

Відкрийте зашифрований PDF і збережіть його як незашифровану копію:

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("encrypted.pdf", password="secret")
doc.save("decrypted.pdf")

WASM

const doc = new WasmPdfDocument(encryptedBytes);
doc.authenticate("secret");
const decrypted = doc.save();
// decrypted — це незашифрований Uint8Array
doc.free();

Rust

let mut doc = Pdf::open_with_password("encrypted.pdf", "secret")?;
doc.save("decrypted.pdf")?;

Повторне шифрування з новим паролем

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("old-protected.pdf", password="oldpass")
doc.save_encrypted("new-protected.pdf", "newuser", "newowner")

WASM

const doc = new WasmPdfDocument(encryptedBytes);
doc.authenticate("oldpass");
const reEncrypted = doc.saveEncryptedToBytes("newuser", "newowner", true, true, true, true);
doc.free();

Rust

let mut doc = Pdf::open_with_password("old-protected.pdf", "oldpass")?;
doc.save_encrypted("new-protected.pdf", "newuser", "newowner")?;

Пакетне шифрування

Зашифруйте всі PDF у каталозі:

from pdf_oxide import PdfDocument, PdfError
from pathlib import Path

input_dir = Path("reports/")
output_dir = Path("protected/")
output_dir.mkdir(exist_ok=True)

for pdf_path in input_dir.glob("*.pdf"):
    try:
        doc = PdfDocument(str(pdf_path))
        out_path = output_dir / pdf_path.name
        doc.save_encrypted(
            str(out_path),
            "company2025",
            "admin2025",
            allow_print=True,
            allow_copy=False,
        )
        print(f"Encrypted: {pdf_path.name}")
    except PdfError as e:
        print(f"Failed: {pdf_path.name}: {e}")

Пакетне дешифрування

Розшифруйте всі PDF за відомим паролем:

from pdf_oxide import PdfDocument, PdfError
from pathlib import Path

input_dir = Path("protected/")
output_dir = Path("decrypted/")
output_dir.mkdir(exist_ok=True)

for pdf_path in input_dir.glob("*.pdf"):
    try:
        doc = PdfDocument(str(pdf_path), password="company2025")
        out_path = output_dir / pdf_path.name
        doc.save(str(out_path))
        print(f"Decrypted: {pdf_path.name}")
    except PdfError as e:
        print(f"Failed: {pdf_path.name}: {e}")

Підтримувані алгоритми

PDF Oxide підтримує всі стандартні алгоритми шифрування PDF:

Алгоритм Довжина ключа Стійкість
AES-256 256 біт Найвища (за замовчуванням)
AES-128 128 біт Висока
RC4-128 128 біт Застарілий
RC4-40 40 біт Слабкий (лише для сумісності)

save_encrypted() за замовчуванням використовує AES-256. Щоб явно вибрати алгоритм, скористайтеся Rust API з EncryptionConfig.

Чому не pdfplumber чи pdfminer?

Ані pdfplumber, ані pdfminer не вміють працювати із зашифрованими PDF:

  • pdfplumber — на PDF, захищених паролем, викидає помилку. Дешифрування не підтримується.
  • pdfminer — підтримка шифрування обмежена; з файлами AES-256 не працює.
  • pypdf — дешифрування є, але видобування тексту після дешифрування у 15× повільніше, ніж у PDF Oxide.

Якщо потрібно масштабно опрацьовувати зашифровані PDF, PDF Oxide нативно виконує і дешифрування, і шифрування за AES-128 та AES-256.

Пов’язані сторінки